定制对象比较以区分列表
在处理包含自定义对象的两个泛型列表时,提取一个列表中(特别是不存在于另一个列表中)的唯一元素是一个有用的操作。
.Except()
方法为此提供了一个有效的解决方案。它接受两个列表参数,并返回一个新列表,其中包含在第一个列表中但在第二个列表中找不到的项。
重写相等性和默认比较
如果您的自定义对象类型重写了 Equals()
和 GetHashCode()
方法,您可以按如下方式使用 .Except()
:
<code class="language-csharp">var list3 = list1.Except(list2).ToList();</code>
在这种情况下,对象的比较依赖于其重写的方法。任何相等性差异都将反映在列表之间的区别中。
自定义相等性比较器
但是,如果您的相等性标准需要自定义实现,您可以定义自己的 IEqualityComparer<T>
。这是一个使用 ID 作为比较基础的示例:
<code class="language-csharp">public class IdComparer : IEqualityComparer<customobject> { // ... (实现如提供的答案中所示) }</code>
随后,您可以通过以下方式将此自定义比较器与 .Except()
一起使用:
<code class="language-csharp">var list3 = list1.Except(list2, new IdComparer()).ToList();</code>
这种定制的比较将确保 .Except()
操作符合您的特定相等性要求。
保留重复项
值得注意的是,.Except()
将排除重复元素。如果需要保留重复项,另一种方法是将第二个列表转换为 HashSet
并使用以下方法:
<code class="language-csharp">var list3 = list1.Where(x => !set2.Contains(x)).ToList();</code>
此方法将保留结果列表 list3
中的所有唯一元素,包括重复项。
以上是如何在 C# 中有效地查找两个自定义对象列表之间的不同元素?的详细内容。更多信息请关注PHP中文网其他相关文章!