8

命名空间中的IEqualityComparerSystem.Collections.Generic具有以下方法:

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

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

我在 namespace 中将它与Enumerable.Distinct()System.Linq方法一起使用,我很惊讶地看到 evenGetHashCode()Equals(). 为什么?如何Distinct工作?

4

4 回答 4

8

有关如何Distinct工作的详细信息(或至少是一个简单的示例实现),请参阅我的Edulinq 博客文章旧 - 404)。

简而言之,对应于适当相等比较的哈希码使得创建一组项目的成本更低。这在很多情况下都很有用 - 例如Distinct, Except, Intersect, Union, Join, GroupJoin, GroupBy,ToLookup等等。

于 2011-02-24T12:37:38.980 回答
1

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

于 2011-02-24T12:35:59.573 回答
0

因为重写 Equals() 和运算符 == 的指南(C# 编程指南)说:

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

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

于 2011-02-24T12:38:40.040 回答
0

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

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

于 2011-02-24T16:02:53.317 回答