使用 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
解决方案 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中文网其他相关文章!