gpt4 book ai didi

linq - 为什么 .Except (LINQ) 不能正确比较事物? (使用 IEquatable)

转载 作者:行者123 更新时间:2023-12-03 10:15:22 24 4
gpt4 key购买 nike

我有两个我自己的引用类型对象的集合,我为它们编写了自己的 IEquatable.Equals 方法,并且我希望能够对它们使用 LINQ 方法。

所以,

List<CandyType> candy = dataSource.GetListOfCandy();
List<CandyType> lollyPops = dataSource.GetListOfLollyPops();
var candyOtherThanLollyPops = candy.Except( lollyPops );

根据 .Except 的文档,不传递 IEqualityComparer 应该会导致 EqualityComparer.Default 用于比较对象。默认比较器的文档是这样的:

“默认属性检查类型 T 是否实现 System.IEquatable 通用接口(interface),如果是,则返回使用该实现的 EqualityComparer。否则,它返回使用 T 提供的 Object.Equals 和 Object.GetHashCode 覆盖的 EqualityComparer。”

所以,因为我为我的对象实现了 IEquatable,它应该使用它并工作。但是,事实并非如此。在我覆盖 GetHashCode 之前它不起作用。事实上,如果我设置了一个断点,我的 IEquatable.Equals 方法就永远不会被执行。这让我认为根据其文档,它与 B 计划相一致。我知道覆盖 GetHashCode 是一个好主意,无论如何,我可以让它工作,但我很沮丧它的行为方式与它自己的文档所述的不符。

为什么它不按照它说的去做?谢谢你。

最佳答案

经过调查,事实证明事情并没有我想象的那么糟糕。基本上,当一切都正确实现( GetHashCode 等)时,文档是正确的,并且行为是正确的。但是,如果您尝试执行类似的操作 IEquatable全部单独,然后您的Equals方法永远不会被调用(这似乎是由于 GetHashCode 没有正确实现)。所以,虽然文档在技术上是错误的,但它只是在你永远不想做的边缘情况下是错误的(如果这个调查教会了我什么,那就是 IEquatable 是你应该实现的一整套方法的一部分原子地(不幸的是,按照惯例,而不是按照规则))。

这方面的好消息来源是:

  • Is there a complete IEquatable implementation reference?
  • MSDN Documentation: IEquatable<T>.Equals(T) Method
  • SYSK 158: IComparable<T> vs. IEquatable<T>
  • 关于linq - 为什么 .Except (LINQ) 不能正确比较事物? (使用 IEquatable),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1645891/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com