确定 List<IMyInterface>.Except() 如何比较项目

Determine how List<IMyInterface>.Except() is comparing items

我读过关于 Except here 的内容。我还是有点糊涂。 我正在使用 .NET 4.8。

我的自定义接口 IMyInterface 有 7 种不同的实现。所有这些实现都保存在一个列表或 IEnumerable 中。我在我的项目的许多地方(伪代码)做了以下事情:

List<IMyInterface> myList = //some items
List<IMyInterface> anotherList = //some more items
var difference = myList.Except(anotherList);

我想我得到了一些不正确的结果。稍微研究一下这个问题,似乎 .NET 通过两个对象指针是否相同来比较相等性。在我的例子中,我将比较的这些元素中的一些将是副本,因此 tra=ditional Equals 将失败。我绝对需要创建一个自定义比较器。

我在所有这些实现上创建了覆盖 Equals() 的方法。示例:

public override bool Equals(object obj)
{
    if (obj is null or not Arc) return false;
    var testObj = (Arc)obj;
    if (Key.SequenceEqual(testObj.Key)) return true;
    return false;
}

然后我在所有新的 Equals() 方法中设置断点,以判断是否正在使用该自定义 Equals() 方法。

我知道 Linq 在需要数据之前不会执行。如果我允许这样的行 运行:

var difference = myList.Except(anotherList);

然后在中断模式下将鼠标悬停在变量 差异 上检查变量的值有结果,但我的断点永远不会被击中。

我如何确定我的环境中使用什么 Except() 来确定我的自定义对象是否相等?

要在比较对象列表的情况下使用 Except,这些对象应实现 IEquatable<T>。在您的情况下,为了安全起见,T 应该是 IMyInterface

或者,您可以使用重载,它采用派生自 IEqualityComparer<IMyInterface>.

的自定义比较器

可以找到更多信息 here