繁体   English   中英

关于IEqualityComparer的问题 <T> /清单 <T> 。不同()

[英]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();
        }
    }
  1. 为什么Distinct要求比较器而不是Func<T,T,bool>
  2. (A)和(B)除了优化之外是否还有其他功能?是否存在由于比较参考的细微之处而无法按预期方式运行的情况?
  3. 如果我愿意,可以将(C)替换为

    return GetHashCode(x) == GetHashCode(y)

  1. 因此它可以使用哈希码为O(n)而不是O(n 2
  2. (一)是一种优化。
    (B)是必需的; 否则,将抛出NullReferenceException 但是,如果Invoice是结构,则它们既不必要又
  3. 否。 哈希码不是唯一的
  • A是确保两个对象都位于同一内存地址的简单且快速的方法,因此它们都引用同一对象。
  • B如果引用之一为空-显然,进行相等比较没有任何意义
  • C否,有时GetHashCode()可以为不同的对象返回相同的值( 哈希冲突 ),因此您应该进行相等比较

关于不同对象的相同哈希码值, MSDN

如果两个对象比较相等,则每个对象的GetHashCode方法必须返回相同的值。 但是,如果两个对象的比较不相等,则两个对象的GetHashCode方法不必返回不同的值。

Distinct()基本上适用于术语“不相等”。 因此,如果您的列表包含非基本类型,则必须实现自己的EqualityComparer。

在A处,检查对象是否相同。 如果两个对象相等,则它们不必相同,但是如果它们相同,则可以确保它们相等。 因此,在某些情况下,A部分可以提高方法的有效性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM