这是我刚刚编写的相等比较器,因为我想要包含实体的列表中的一组不同的项目。
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>
? - (A) 和 (B) 除了优化之外还有什么吗?是否存在由于比较引用时的微妙而导致它们无法按预期方式行事的情况?
如果我愿意,我可以将 (C) 替换为
return GetHashCode(x) == GetHashCode(y)
最佳答案
- 因此它可以使用哈希码来实现 O(n) 而不是 O(n2)
- (A) 是一个优化。
(B) 是必要的;否则,它会抛出一个NullReferenceException
。 但是,如果Invoice
是一个结构体,则它们都是不必要的,而且速度较慢。 - 没有。 哈希码不是唯一的
关于c# - 关于IEqualityComparer<T>/List<T>.Distinct()的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8526797/