c# - 关于IEqualityComparer<T>/List<T>.Distinct()的问题

标签 c# iequalitycomparer

这是我刚刚编写的相等比较器,因为我想要包含实体的列表中的一组不同的项目。

    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(n2)
  2. (A) 是一个优化。
    (B) 是必要的;否则,它会抛出一个 NullReferenceException。 但是,如果 Invoice 是一个结构体,则它们都是不必要的,而且速度较慢
  3. 没有。 哈希码不是唯一的

关于c# - 关于IEqualityComparer<T>/List<T>.Distinct()的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8526797/

相关文章:

.net - IStructuralEquatable 和 IStructuralComparable 解决什么问题?

c# - 长原语的 GetHashCode()

c# - 比较两个 Dictionary<T> 是否相等的最佳方法

c# - 将 Zip 文件转换为 byte[] 并将 byte[] 转换为 zip 文件

c# - 有没有办法在实例化从泛型继承的类型时不使用动态?

c# - 无法在 C# webbrowser 中加载 Telegram.org?

c# - RangeFileContentResult 和带有远程请求的视频流

c# - 程序运行了多少次? C#

c# - EqualityComparer <Type> GetHashCode和等于

c# - 从 DataTable 中删除重复项并自定义 IEqualityComparer<DataRow>