![](/img/trans.png)
[英]IEqualityComparer<T> does not work with List<T>.Distinct() method
[英]Questions about IEqualityComparer<T> / List<T>.Distinct()
这是我刚刚写的相等比较器,因为我想要一组包含实体的列表中的一组不同项目。
class InvoiceComparer : IEqualityComparer<Invoice>
{
public bool Equals(Invoice x, Invoice y)
{
// A
if (Object.ReferenceEquals(x, y)) return true;
// B
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) return false;
// C
return x.TxnID == y.TxnID;
}
public int GetHashCode(Invoice obj)
{
if (Object.ReferenceEquals(obj, null)) return 0;
return obj.TxnID2.GetHashCode();
}
}
Distinct
要求比较器而不是Func<T,T,bool>
? 如果我愿意,可以将(C)替换为
return GetHashCode(x) == GetHashCode(y)
NullReferenceException
。 但是,如果Invoice
是结构,则它们既不必要又慢 。 A
是确保两个对象都位于同一内存地址的简单且快速的方法,因此它们都引用同一对象。 B
如果引用之一为空-显然,进行相等比较没有任何意义 C
否,有时GetHashCode()可以为不同的对象返回相同的值( 哈希冲突 ),因此您应该进行相等比较 关于不同对象的相同哈希码值, MSDN :
如果两个对象比较相等,则每个对象的GetHashCode方法必须返回相同的值。 但是,如果两个对象的比较不相等,则两个对象的GetHashCode方法不必返回不同的值。
Distinct()基本上适用于术语“不相等”。 因此,如果您的列表包含非基本类型,则必须实现自己的EqualityComparer。
在A处,检查对象是否相同。 如果两个对象相等,则它们不必相同,但是如果它们相同,则可以确保它们相等。 因此,在某些情况下,A部分可以提高方法的有效性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.