为什么我们在IEqualityComparer中实现GetHashCode?

时间:2011-09-30 10:09:20

标签: c# equals gethashcode iequalitycomparer

我希望使用List接口从C#中的IEqualityComparer获取不同的项目。但我不知道GetHashCode。我已经实现了GetHashCodeEquals方法。如何调用Equals方法从具有用户定义数据类型的列表中获取不同的项目。

3 个答案:

答案 0 :(得分:4)

  

如何调用Equals方法从具有用户定义数据类型的列表中获取不同的项目。

使用IEqualityComparer IEqualityComparer使用自定义相等比较器从序列中获取不同的项目。

  

为什么我们在IEqualityComparer中实现GetHashCode?

这样IEqualityComparer.GetHashCode可以用作哈希表中相等性的测试(根据IEqualityComparer.Equals方法对项进行哈希,使用{{1}}在需要时检查相等性(例如,在哈希表中搜索项目。

答案 1 :(得分:4)

您可以使用Distinct扩展方法将自定义相等比较器传递给它。

您需要GetHashCode()的原因是没有它,您需要进行O(n^2)次比较。使用GetHashCode()可以将项目划分为多个存储桶,这样就可以获得O(n)一个良好的哈希实现。

如果项目类型属于您自己的类型,则可以覆盖类型本身中的EqualsGetHashCode,而不是创建IEqualityComparer<T>

答案 2 :(得分:0)

  

为什么我们在IEqualityComparer中实现GetHashCode?

因为它在IEqualityComparer上调用,通常首先在Equals之前调用,至少对于需要IEqualityComparer的LINQ扩展方法。否则,你是否真的需要实现GetHashCode以确定相等性是有问题的,因为你可以使用Equals方法。为什么LINQ更喜欢调用GetHashCode?看到 Why use GetHashCode() over Equals()?