编程语言
首页 > 编程语言> > c# – 关于IEqualityComparer / List.Distinct()的问题

c# – 关于IEqualityComparer / List.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>?
>(A)和(B)除了优化之外还有什么其他情况,并且由于比较参考文件的细微之处,是否存在不按预期方式行事的情况?
>如果我想,我可以替换(C)

return GetHashCode(x)== GetHashCode(y)

解决方法:

>因此它可以使用哈希码为O(n)而不是O(n2)
>(A)是一种优化.
(B)是必要的;否则,它会抛出NullReferenceException.
但是,如果Invoice是一个结构,那么它们既不必要又慢.
>不.Hashcodes不是唯一的

标签:c,iequalitycomparer
来源: https://codeday.me/bug/20190521/1146965.html