确定 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。
我读过关于 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。