繁体   English   中英

为什么IEqualityComparer <T> 有GetHashCode()方法?

[英]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有用 - 例如DistinctExceptIntersectUnionJoinGroupJoinGroupByToLookup等。

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

因为覆盖等于()和运算符指南==(C#编程指南)说:

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

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM