我有一个项目列表列表,如下所示。
List<List<int>> testItems=new List<List<int>>();
我已经添加了这样的项目。
List<int> item=new List<item>();
item.clear();
item.Add(3);
item.Add(5);
item.Add(7);
testItems.Add(item);
item.clear();
item.Add(10);
item.Add(3);
testItems.Add(item);
item.clear();
item.Add(1);
item.Add(8);
item.Add(3);
item.Add(9);
testItems.Add(item);
现在我要做的是我想要提取所有列表共有的元素,并将其添加到另一个名为finalList的列表中。
List<int> finalList = new List<int>();
我尝试了以下内容。
int count;
foreach (List<int> a in testItems)
{
count = 0;
foreach (int b in a)
{
foreach (List<int> c in testItems)
{
foreach (int d in c)
{
if (d == b)
{
count++;
break;
}
}
}
if (count == a.Count)
finalList.Add(b);
}
}
我知道这个解决方案并不是最优的,也不能满足我的需要。它可能会多次添加相同的项目。有人可以帮我解决吗?
答案 0 :(得分:2)
您添加项目的代码不会添加三个不同的项目。当您重复使用该项时,代码相当于:
List<int> item=new List<int>();
item.Add(1);
item.Add(8);
item.Add(3);
item.Add(9);
testItems.Add(item);
testItems.Add(item);
testItems.Add(item);
您需要创建新项目,而不是重复使用相同的项目:
List<int> item = new List<int>();
item.Add(3);
item.Add(5);
item.Add(7);
testItems.Add(item);
item = new List<int>();
item.Add(10);
item.Add(3);
testItems.Add(item);
item = new List<int>();
item.Add(1);
item.Add(8);
item.Add(3);
item.Add(9);
testItems.Add(item);
为了更有效地获取所有项目共有的数字,您可以遍历第一项中的所有值,并检查所有其他项目中存在哪些值:
List<int> finalList =
testItems[0].Where(
i => testItems.Skip(1).All(x => x.Contains(i))
).ToList();
答案 1 :(得分:1)
您可以使用LINQ方法Intersect
你会得到这样的东西:
IEnumerable<int> result = testItems[0];
for(int i = 1; i < testItems.Count; i++)
{
result = result.Intersect(testItems[i]);
}
你在结果变量中得到你的交集。
但你真的确定你需要这个奇怪的清单吗?