Почему мы реализуем GetHashCode в IEqualityComparer?

Я хочу получить отдельные элементы из List в C#, используя интерфейс IEqualityComparer. Но я не знаю о GetHashCode. Я реализовал методы GetHashCode и Equals. И как я могу вызвать метод Equals, чтобы получить отдельные элементы из списка с типом данных, определяемым пользователем.


person NASSER    schedule 30.09.2011    source источник
comment
Я добавил довольно полный ответ на этот вопрос здесь: 4096774" title="какова роль gethashcode в iequalitycomparert в сети"> stackoverflow.com/questions/4095395/   -  person sheikhjabootie    schedule 09.10.2011
comment
возможный дубликат whats-the-role -of-getashcode-in-the-iequalitycomparert-in-net   -  person nawfal    schedule 02.06.2013


Ответы (3)


И как я могу вызвать метод Equals, чтобы получить отдельные элементы из списка с типом данных, определяемым пользователем.

Используйте перегрузку Enumerable.Distinct, которая требует IEqualityComparer для получения отдельных элементов из последовательность, используя ваш пользовательский компаратор равенства.

Почему мы реализуем GetHashCode в IEqualityComparer?

Чтобы IEqualityComparer можно было использовать в качестве теста на равенство в хэш-таблице (хэшируйте элементы в соответствии с методом IEqualityComparer.GetHashCode, используйте IEqualityComparer.Equals для проверки на равенство при необходимости (например, при поиске элемента в хеш-таблице).

person jason    schedule 30.09.2011

Вы можете использовать метод расширения Distinct, передав ему свой собственный компаратор равенства.

Причина, по которой вам нужно GetHashCode(), заключается в том, что без этого вам нужно O(n^2) сравнений. С помощью GetHashCode() элементы можно разделить на сегменты, что приводит к O(n) для хорошей реализации хеширования.

Если тип элемента является вашим собственным, вы можете переопределить Equals и GetHashCode в самом типе вместо создания IEqualityComparer<T>

person CodesInChaos    schedule 30.09.2011
comment
@JonHanna 1+2+3+...+n-1 = 0,5*n*(n-1) => O(n^2) Не знаю, как вы получили O(n!). Столько ребер представляет собой граф с n узлами. Вы также можете легко увидеть, что наивная реализация Distinct имеет два вложенных цикла и не имеет рекурсии. - person CodesInChaos; 19.12.2011
comment
да. При рассмотрении вы совершенно правы. В самом деле, если подумать, я даже не могу представить, что, черт возьми, заставило меня думать, что это будет O(n!). - person Jon Hanna; 19.12.2011

Почему мы реализуем GetHashCode в IEqualityComparer?

Поскольку он вызывается в IEqualityComparer, обычно первым, перед Equals, по крайней мере, для методов расширения LINQ, для которых требуется IEqualityComparer. В противном случае было бы сомнительно, действительно ли вам нужно реализовывать GetHashCode для определения равенства, поскольку вы могли бы просто использовать для этого метод Equals. Почему LINQ предпочитает вызывать GetHashCode? См. раздел Зачем использовать GetHashCode() вместо Equals()?

person T. Webster    schedule 09.10.2011