【问题标题】:Intersection of 6 List<int> objects6 个 List<int> 对象的交集
【发布时间】:2010-09-01 14:51:27
【问题描述】:
正如我在标题中提到的,我手上有 6 个 List 对象。我想找到它们的交集,除了那些没有项目的。
intersectionResultSet =
list1.
Intersect(list2).
Intersect(list3).
Intersect(list4).
Intersect(list5).
Intersect(list6).ToList();
当其中一个没有项目时,通常我会得到空集。所以我想从交集操作中排除那些没有项目的项目。最好的方法是什么?
提前致谢,
【问题讨论】:
标签:
c#
linq
list
ienumerable
【解决方案1】:
你可以使用这样的东西:
// Your handful of lists
IEnumerable<IEnumerable<int>> lists = new[]
{
new List<int> { 1, 2, 3 },
new List<int>(),
null,
new List<int> { 2, 3, 4 }
};
List<int> intersection = lists
.Where(c => c != null && c.Any())
.Aggregate(Enumerable.Intersect)
.ToList();
foreach (int value in intersection)
{
Console.WriteLine(value);
}
这已经过测试并产生以下输出:
2
3
感谢@Matajon 指出Enumerable.Intersect 在Aggregate 函数中的使用更简洁(并且性能更高)。
【解决方案2】:
简单地说,也使用 LINQ。
var lists = new List<IEnumerable<int>>() { list1, list2, list3, list4, list5, list6 };
var result = lists
.Where(x => x.Any())
.Aggregate(Enumerable.Intersect)
.ToList();
【解决方案3】:
您可以使用 LINQ 获取所有长于 0 的列表,然后将它们发送到您描述的函数。
另一种选择:
覆盖/扩展“相交”到仅当列表不为空时才在列表上进行相交的函数,并调用它而不是相交。