У меня есть случай, когда два объекта можно сравнить с разными способами для равенства. Например:Каков правильный способ установки ложного IEqualityComparer <T>?
public class HeightComparer : IEqualityComparer<Person> {
public bool Equals(Person x, Person y) {
return x.Height.Equals(y.Height);
}
public int GetHashCode(Person obj) {
return obj.Height;
}
}
И я использую эти компараторов в Dictionary<Person,Person>(IEqualityComparer<Person>)
для различных методов. Как бы вы сделали сравнитель, который гарантирует, что каждый человек уникален? Я придумал следующее, но он работает медленно, так как метод GetHashCode() часто возвращает одно и то же значение.
public class NullPersonComparer : IEqualityComparer<Person> {
public bool Equals(Person x, Person y) {
return false; // always unequal
}
public int GetHashCode(Person obj) {
return obj.GetHashCode();
}
}
Я мог бы вернуть то же значение 0
от GetHashCode(Person obj)
, но он по-прежнему медленно наполнения словаря.
Редактировать
Вот Прецедент:
Dictionary<Person, Person> people = new Dictionary<Person, Person>(comparer);
foreach (string name in Names)
{
Person person= new Person(name);
Person realPerson;
if (people.TryGetValue(person, out realPerson))
{
realPerson.AddName(name);
}
else
{
people.Add(person, person);
}
}
Могли бы вы лучше описать свой вариант использования? Не совсем понятно, что вы подразумеваете под «уникальным» или тем, что вы пытаетесь выполнить. – MgSam
Считается уникальным, даже если в коллекции, которую вы хешируете, содержится много обманов? Внедрите GetHashCode, чтобы он всегда возвращал уникальный номер (возможно, увеличивался на единицу каждый раз, когда он вызывается). Тогда хэш-таблице не нужно будет так часто решать конфликты. – spender
@MgSam различные объекты в памяти. Две ссылки на одного и того же человека должны рассматриваться одинаково. Но два человека с одинаковой статистикой должны быть разными, если они созданы отдельно. – Moop