4

我想List通过使用IEqualityComparer接口从 C# 中获取不同的项目。但我不知道GetHashCode。我已经实现了GetHashCodeEquals方法。以及如何调用Equals方法从具有用户定义数据类型的列表中获取不同的项目。

4

3 回答 3

5

您可以使用Distinct扩展方法将您的自定义相等比较器传递给它。

你需要的原因GetHashCode()是没有它你需要O(n^2)比较。可以将GetHashCode()项目划分为桶,这导致O(n)了良好的哈希实现。

如果项目类型是您自己的,您可以在类型本身中覆盖EqualsGetHashCode,而不是创建一个IEqualityComparer<T>

于 2011-09-30T10:13:16.620 回答
4

以及如何调用 Equals 方法从具有用户定义数据类型的列表中获取不同的项目。

使用 that 的重载Enumerable.DistinctIEqualityComparer使用自定义相等比较器从序列中获取不同的项目。

为什么我们在 IEqualityComparer 中实现 GetHashCode?

这样IEqualityComparer可以将其用作哈希表中的相等性测试(根据IEqualityComparer.GetHashCode方法对项目进行哈希处理IEqualityComparer.Equals,在需要时用于检查相等性(例如,在哈希表中搜索项目)。

于 2011-09-30T10:12:32.293 回答
0

为什么我们在 IEqualityComparer 中实现 GetHashCode?

因为它在 IEqualityComparer 上被调用,通常首先在 Equals 之前调用,至少对于需要 IEqualityComparer 的 LINQ 扩展方法。否则,您是否真的需要实现 GetHashCode 来确定相等性是有问题的,因为您可以为此使用 Equals 方法。为什么 LINQ 更喜欢调用 GetHashCode?请参阅 为什么使用 GetHashCode() 而不是 Equals()?

于 2011-10-09T00:21:39.733 回答