System.Collections.Generic
中的IEqualityComparer具有以下方法:
bool Equals(T x, T y);
int GetHashCode(T obj);
由于此接口用于检查对象的相等性,因此第一种方法Equals
是有意义的。但为什么我们也需要实施GetHashCode
?为什么它首先存在于界面中?什么时候需要?为什么?
我在命名空间System.Linq
中使用Enumerable.Distinct()方法,我很惊讶地看到即使GetHashCode()
被调用,还有Equals()
。为什么? Distinct
如何运作?
答案 0 :(得分:8)
有关Distinct
的工作原理(或至少是一个简单的示例实现)的详细信息,请参阅我的Edulinq blog post on it( old - 404 )。
简单地说,对应于适当的相等比较的哈希码使得创建一组项目更便宜。这在情况的很多中非常有用 - 例如Distinct
,Except
,Intersect
,Union
,Join
,{{1 },GroupJoin
,GroupBy
等。
答案 1 :(得分:1)
GetHashCode
用于HashTables
,Dictionaries
和其他人,以优化搜索。看看这里: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)是危险的;太糟糕了,没有通用约束禁止使用未密封的类。