在linq中加入未知数量的列表

Ken*_*ley 3 c# linq

我有一种情况,我已经生成了许多包含整数值的列表.但是,这些列表的数量仅在运行时已知,并且结果列表中存在的整数必须存在于所有列表中.有没有一种方法可以将所有这些列表合并到一个列表中?

List<int> l1 = {1, 2, 3, 4};
List<int> l2 = {2, 3, 5, 7, 9};
List<int> l3 = {3, 9, 10};
List<int> ln = {....};
Run Code Online (Sandbox Code Playgroud)

结果列表应如下所示

List<int> r = {3};
Run Code Online (Sandbox Code Playgroud)

这可能与linq或任何其他方法?

dtb*_*dtb 5

我假设你有List<List<int>>一个可变数量的List<int>.

您可以将第一个列表与第二个列表相交

var intersection = listOfLists[0].Intersect(listOfLists[1]);
Run Code Online (Sandbox Code Playgroud)

然后将结果与第三个列表相交

intersection = intersection.Intersect(listOfLists[2]);
Run Code Online (Sandbox Code Playgroud)

等等直到intersection持有所有列表.

intersection = intersection.Intersect(listOfLists[listOfLists.Count - 1]);
Run Code Online (Sandbox Code Playgroud)

使用for循环:

IEnumerable<int> intersection = listOfLists[0];

for (int i = 1; i < listOfLists.Count; i++)
{
    intersection = intersection.Intersect(listOfLists[i]);
}
Run Code Online (Sandbox Code Playgroud)

使用foreach循环(如@lazyberezovsky所示):

IEnumerable<int> intersection = listOfLists.First();

foreach (List<int> list in listOfLists.Skip(1))
{
    intersection = intersection.Intersect(list);
}
Run Code Online (Sandbox Code Playgroud)

使用Enumerable.Aggregate:

var intersection = listOfLists.Aggregate(Enumerable.Intersect);
Run Code Online (Sandbox Code Playgroud)

如果顺序不重要,那么您还可以使用填充第一个列表并与剩余列表相交HashSet <T>(如@Servy所示).

var intersection = new HashSet<int>(listOfLists.First());

foreach (List<int> list in listOfLists.Skip(1))
{
    intersection.IntersectWith(list);
}
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢`Aggregate`版本. (2认同)