[英]Why IEqualityComparer<T> has GetHashCode() method?
System.Collections.Generic
命名空间中的IEqualityComparer具有以下方法:
bool Equals(T x, T y);
int GetHashCode(T obj);
由于此接口用于检查对象的相等性,因此第一种方法Equals
是有意义的。 但是为什么我们还需要实现GetHashCode
呢? 为什么它首先存在于界面中? 什么时候需要,为什么?
我在命名空间System.Linq
使用它与Enumerable.Distinct()方法,我很惊讶地发现即使GetHashCode()
和Equals()
一起被调用。 为什么? Distinct
如何运作?
有关Distinct
如何工作(或至少是一个简单的示例实现)的详细信息,请参阅我的Edulinq博客文章 ( 旧版 - 404 )。
简单地说,对应于适当的相等比较的哈希码使得创建一组项目更便宜。 这在很多情况下Distinct
有用 - 例如Distinct
, Except
, Intersect
, Union
, Join
, GroupJoin
, GroupBy
, ToLookup
等。
GetHashCode
用于HashTables
, Dictionaries
等,以优化搜索。 看看这里: http : //msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
IEqualityComparer(Of T)的目的是允许使用与默认Object.Equals在语义上不同的比较方法 - 即使Object.Equals认为它们不同,也可能导致两个对象被认为是相等的。 have equal hash codes, and because things which the EqualityComparer's Equals method considers equal but Object.Equals considers unequal might have different hash codes, it is necessary for the the EqualityComparer to use a different hash-coding method. 因为相等的对象具有相等的哈希码,并且因为EqualityComparer的Equals方法认为相等而Object.Equals认为不相等的东西可能具有不同的哈希码,所以EqualityComparer必须使用不同的哈希编码方法。
IEquatable(Of T)存在一个更有趣的情况。 如果Object.Equals报告它们不相等,那么预计永远不会将两个对象报告为相等。 对于任何未密封的类来实现IEquatable(Of T)是危险的; 太糟糕了,没有通用约束禁止使用未密封的类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.