C# 6个列表的交叉点<;int>;物体

C# 6个列表的交叉点<;int>;物体,c#,linq,list,ienumerable,C#,Linq,List,Ienumerable,正如我在标题中提到的,我手里有6个列表对象。我想找到它们的交集,除了那些没有项目的交集 intersectionResultSet = list1. Intersect(list2). Intersect(list3). Intersect(list4). Intersect(list5). Intersect(list6).ToList(); 当其中一个没有项目时,通常我得到的结果是空集。所以我想从交叉操作中排除没有项目的项目。最好的方法是什么

正如我在标题中提到的,我手里有6个列表对象。我想找到它们的交集,除了那些没有项目的交集

intersectionResultSet =
    list1.
    Intersect(list2).
    Intersect(list3).
    Intersect(list4).
    Intersect(list5).
    Intersect(list6).ToList();
当其中一个没有项目时,通常我得到的结果是空集。所以我想从交叉操作中排除没有项目的项目。最好的方法是什么


提前感谢,

您可以使用LINQ获取比0长的所有列表,然后将它们发送到您描述的函数

另一种选择:
重写/扩展“Intersect”到仅在列表中不为空时才相交的函数,并调用它而不是Intersect

您可以使用以下内容:

// 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);
}
//你的一小撮列表
IEnumerable列表=新建[]
{
新名单{1,2,3},
新列表(),
无效的
新名单{2,3,4}
};
列表交点=列表
.Where(c=>c!=null&&c.Any())
.聚合(可枚举.相交)
.ToList();
foreach(交叉点的int值)
{
控制台写入线(值);
}
这已经过测试,并产生以下输出:

2 3 2. 3.
感谢@Matajon在
Aggregate
函数中指出了
Enumerable.Intersect
更清晰(更高效)的使用。

简单地说,也使用LINQ

var lists = new List<IEnumerable<int>>() { list1, list2, list3, list4, list5, list6 };

var result = lists
    .Where(x => x.Any())
    .Aggregate(Enumerable.Intersect)
    .ToList();
var List=newlist(){list1,list2,list3,list4,list5,list6};
var结果=列表
.Where(x=>x.Any())
.聚合(可枚举.相交)
.ToList();