我希望使用List
接口从C#中的IEqualityComparer
获取不同的项目。但我不知道GetHashCode
。我已经实现了GetHashCode
和Equals
方法。如何调用Equals
方法从具有用户定义数据类型的列表中获取不同的项目。
答案 0 :(得分:4)
如何调用Equals方法从具有用户定义数据类型的列表中获取不同的项目。
使用IEqualityComparer
IEqualityComparer
使用自定义相等比较器从序列中获取不同的项目。
为什么我们在IEqualityComparer中实现GetHashCode? p>
这样IEqualityComparer.GetHashCode
可以用作哈希表中相等性的测试(根据IEqualityComparer.Equals
方法对项进行哈希,使用{{1}}在需要时检查相等性(例如,在哈希表中搜索项目。
答案 1 :(得分:4)
您可以使用Distinct
扩展方法将自定义相等比较器传递给它。
您需要GetHashCode()
的原因是没有它,您需要进行O(n^2)
次比较。使用GetHashCode()
可以将项目划分为多个存储桶,这样就可以获得O(n)
一个良好的哈希实现。
如果项目类型属于您自己的类型,则可以覆盖类型本身中的Equals
和GetHashCode
,而不是创建IEqualityComparer<T>
答案 2 :(得分:0)
为什么我们在IEqualityComparer中实现GetHashCode? p>
因为它在IEqualityComparer上调用,通常首先在Equals之前调用,至少对于需要IEqualityComparer的LINQ扩展方法。否则,你是否真的需要实现GetHashCode以确定相等性是有问题的,因为你可以使用Equals方法。为什么LINQ更喜欢调用GetHashCode?看到 Why use GetHashCode() over Equals()?