Почему мы реализуем GetHashCode в IEqualityComparer? - PullRequest
4 голосов
/ 30 сентября 2011

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

Ответы [ 3 ]

4 голосов
/ 30 сентября 2011

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

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

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

4 голосов
/ 30 сентября 2011

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

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

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

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

0 голосов
/ 09 октября 2011

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

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

...