我想List
通过使用IEqualityComparer
接口从 C# 中获取不同的项目。但我不知道GetHashCode
。我已经实现了GetHashCode
和Equals
方法。以及如何调用Equals
方法从具有用户定义数据类型的列表中获取不同的项目。
3 回答
您可以使用Distinct
扩展方法将您的自定义相等比较器传递给它。
你需要的原因GetHashCode()
是没有它你需要O(n^2)
比较。可以将GetHashCode()
项目划分为桶,这导致O(n)
了良好的哈希实现。
如果项目类型是您自己的,您可以在类型本身中覆盖Equals
和GetHashCode
,而不是创建一个IEqualityComparer<T>
以及如何调用 Equals 方法从具有用户定义数据类型的列表中获取不同的项目。
使用 that 的重载,Enumerable.Distinct
IEqualityComparer
使用自定义相等比较器从序列中获取不同的项目。
为什么我们在 IEqualityComparer 中实现 GetHashCode?
这样IEqualityComparer
可以将其用作哈希表中的相等性测试(根据IEqualityComparer.GetHashCode
方法对项目进行哈希处理IEqualityComparer.Equals
,在需要时用于检查相等性(例如,在哈希表中搜索项目)。
为什么我们在 IEqualityComparer 中实现 GetHashCode?
因为它在 IEqualityComparer 上被调用,通常首先在 Equals 之前调用,至少对于需要 IEqualityComparer 的 LINQ 扩展方法。否则,您是否真的需要实现 GetHashCode 来确定相等性是有问题的,因为您可以为此使用 Equals 方法。为什么 LINQ 更喜欢调用 GetHashCode?请参阅 为什么使用 GetHashCode() 而不是 Equals()?