首页 >后端开发 >C++ >如何在 C# 中有效地查找两个自定义对象列表之间的不同元素?

如何在 C# 中有效地查找两个自定义对象列表之间的不同元素?

Linda Hamilton
Linda Hamilton原创
2025-01-23 01:05:12841浏览

How Can I Efficiently Find Distinct Elements Between Two Lists of Custom Objects in C#?

定制对象比较以区分列表

在处理包含自定义对象的两个泛型列表时,提取一个列表中(特别是不存在于另一个列表中)的唯一元素是一个有用的操作。

.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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn