Я хочу получить отдельные элементы из List
в C#, используя интерфейс IEqualityComparer
. Но я не знаю о GetHashCode
. Я реализовал методы GetHashCode
и Equals
. И как я могу вызвать метод Equals
, чтобы получить отдельные элементы из списка с типом данных, определяемым пользователем.
Почему мы реализуем GetHashCode в IEqualityComparer?
Ответы (3)
И как я могу вызвать метод Equals, чтобы получить отдельные элементы из списка с типом данных, определяемым пользователем.
Используйте перегрузку Enumerable.Distinct
, которая требует IEqualityComparer
для получения отдельных элементов из последовательность, используя ваш пользовательский компаратор равенства.
Почему мы реализуем GetHashCode в IEqualityComparer?
Чтобы IEqualityComparer
можно было использовать в качестве теста на равенство в хэш-таблице (хэшируйте элементы в соответствии с методом IEqualityComparer.GetHashCode
, используйте IEqualityComparer.Equals
для проверки на равенство при необходимости (например, при поиске элемента в хеш-таблице).
Вы можете использовать метод расширения Distinct
, передав ему свой собственный компаратор равенства.
Причина, по которой вам нужно GetHashCode()
, заключается в том, что без этого вам нужно O(n^2)
сравнений. С помощью GetHashCode()
элементы можно разделить на сегменты, что приводит к O(n)
для хорошей реализации хеширования.
Если тип элемента является вашим собственным, вы можете переопределить Equals
и GetHashCode
в самом типе вместо создания IEqualityComparer<T>
Distinct
имеет два вложенных цикла и не имеет рекурсии.
- person CodesInChaos; 19.12.2011
Почему мы реализуем GetHashCode в IEqualityComparer?
Поскольку он вызывается в IEqualityComparer, обычно первым, перед Equals, по крайней мере, для методов расширения LINQ, для которых требуется IEqualityComparer. В противном случае было бы сомнительно, действительно ли вам нужно реализовывать GetHashCode для определения равенства, поскольку вы могли бы просто использовать для этого метод Equals. Почему LINQ предпочитает вызывать GetHashCode? См. раздел Зачем использовать GetHashCode() вместо Equals()?