首页 >后端开发 >C++ >如何使用 IEnumerable.Intersect() 查找多个列表的交集?

如何使用 IEnumerable.Intersect() 查找多个列表的交集?

Patricia Arquette
Patricia Arquette原创
2025-01-15 11:36:48707浏览

How to Find the Intersection of Multiple Lists Using IEnumerable.Intersect()?

使用 IEnumerable.Intersect() 查找多个列表的交集

C# 中的 IEnumerable.Intersect() 方法允许您查找两个序列中的公共元素。但是,如果您有多个列表,并希望识别所有列表中都存在的元素,该怎么办?

问题:

给定一个整数列表列表:

<code class="language-csharp">var list1 = new List<int>() { 1, 2, 3 };
var list2 = new List<int>() { 2, 3, 4 };
var list3 = new List<int>() { 3, 4, 5 };
var listOfLists = new List<List<int>>() { list1, list2, list3 };</code>

如何使用 IEnumerable.Intersect() 查找这些列表的交集,得到结果 List() { 3 }?

解决方案 1:HashSet 聚合

<code class="language-csharp">var intersection = listOfLists
    .Skip(1)
    .Aggregate(
        new HashSet<int>(listOfLists.First()),
        (h, e) => { h.IntersectWith(e); return h; }
    );</code>

此解决方案使用 Aggregate() 方法累积一个 HashSet,该 HashSet 表示列表的交集。Skip(1) 方法确保 listOfLists 中的第一个列表用作 HashSet 的初始值。

解决方案 2:HashSet 迭代

<code class="language-csharp">var intersection = new HashSet<int>(listOfLists.First());

foreach (var list in listOfLists.Skip(1))
{
    var intersect = new HashSet<int>(intersection);
    intersection.IntersectWith(list);
}</code>

此解决方案也使用 HashSet,但它迭代剩余的列表,为每个交集创建一个新的 HashSet。

性能考虑:

性能基准测试表明,在大多数情况下,HashSet 解决方案的性能优于使用 List。foreach 方法和 Aggregate 方法在性能方面差异可以忽略不计。

以上是如何使用 IEnumerable.Intersect() 查找多个列表的交集?的详细内容。更多信息请关注PHP中文网其他相关文章!

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