正如我在标题中所提到的,我手中有6个List对象。我想找到他们的交集,除了没有项目的人。
intersectionResultSet =
list1.
Intersect(list2).
Intersect(list3).
Intersect(list4).
Intersect(list5).
Intersect(list6).ToList();
当其中一个没有项目时,通常我会得到空集。所以我想从交叉操作中排除没有项目的那些。最好的方法是什么?
提前致谢,
答案 0 :(得分:11)
您可以使用以下内容:
// 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
更清晰(更高效)。
答案 1 :(得分:5)
简单地说,也使用LINQ。
var lists = new List<IEnumerable<int>>() { list1, list2, list3, list4, list5, list6 };
var result = lists
.Where(x => x.Any())
.Aggregate(Enumerable.Intersect)
.ToList();
答案 2 :(得分:1)
您可以使用LINQ获取超过0的所有列表,然后将它们发送到您描述的函数。
另一种选择: 将“相交”覆盖/扩展到仅在列表上相交的函数,如果它不为空,则调用它而不是相交。