这是我刚刚写的等式比较器,因为我想要一个包含实体的列表中的一组不同的项目。
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)
答案 0 :(得分:4)
NullReferenceException
。
但是,如果Invoice
是一个结构,那么它们都是不必要的,并且更慢。答案 1 :(得分:1)
A
是一种简单快捷的方法,可以确保两个对象都位于同一个内存地址,因此它们都引用同一个对象。B
- 如果其中一个引用为null - 显然,进行相等比较没有任何意义C
- 不,有时GetHashCode()可以为不同的对象(hash collision)返回相同的值,因此您应该进行相等比较关于不同对象的相同哈希码值,MSDN:
如果两个对象比较相等,则每个对象的GetHashCode方法 对象必须返回相同的值。但是,如果两个对象没有 比较相同,两个对象的GetHashCode方法不相同 必须返回不同的值。
答案 2 :(得分:0)
Distinct()基本上适用于“不相等”一词。因此,如果您的列表包含非原始类型,则必须实现自己的EqualityComparer。
在A处,检查对象是否相同。如果两个对象相等,则它们不必相同,但如果它们相同,则可以确定它们是相同的。所以A部分可以在某些情况下增加方法的有效性。