为什么IEqualityComparer <t>具有GetHashCode()方法?</t>

时间:2011-02-24 12:33:29

标签: c# linq ienumerable iequalitycomparer

命名空间System.Collections.Generic中的

IEqualityComparer具有以下方法:

bool Equals(T x, T y);
int GetHashCode(T obj);

由于此接口用于检查对象的相等性,因此第一种方法Equals是有意义的。但为什么我们也需要实施GetHashCode?为什么它首先存在于界面中?什么时候需要?为什么?

我在命名空间System.Linq中使用Enumerable.Distinct()方法,我很惊讶地看到即使GetHashCode()被调用,还有Equals()。为什么? Distinct如何运作?

4 个答案:

答案 0 :(得分:8)

有关Distinct的工作原理(或至少是一个简单的示例实现)的详细信息,请参阅我的Edulinq blog post on it old - 404 )。

简单地说,对应于适当的相等比较的哈希码使得创建一组项目更便宜。这在情况的很多中非常有用 - 例如DistinctExceptIntersectUnionJoin,{{1 },GroupJoinGroupBy等。

答案 1 :(得分:1)

GetHashCode用于HashTablesDictionaries和其他人,以优化搜索。看看这里:http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

答案 2 :(得分:0)

因为Guidelines for Overriding Equals() and Operator == (C# Programming Guide)说:

  

建议任何覆盖Equals的类也会覆盖Object.GetHashCode。

这是因为Hashtables等期望两个相等的对象具有相同的哈希码。

答案 3 :(得分:0)

IEqualityComparer(Of T)的目的是允许使用与默认Object.Equals在语义上不同的比较方法 - 即使Object.Equals会考虑它们,也可能导致两个对象被认为是相等的不同。因为等对象必须具有相同的哈希码,并且因为EqualityComparer的Equals方法认为相等但Object.Equals认为不相等的东西可能具有不同的哈希码,所以EqualityComparer必须使用不同的哈希编码方法。

IEquatable(Of T)存在一个更有趣的情况。如果Object.Equals报告它们不相等,那么预计永远不会将两个对象报告为相等。对于任何未密封的类来实现IEquatable(Of T)是危险的;太糟糕了,没有通用约束禁止使用未密封的类。