C# - 在整数列表列表中查找公共元素

时间:2015-04-11 11:21:35

标签: c# list

我有一个项目列表列表,如下所示。

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);
    }
}

我知道这个解决方案并不是最优的,也不能满足我的需要。它可能会多次添加相同的项目。有人可以帮我解决吗?

2 个答案:

答案 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]);
}

你在结果变量中得到你的交集。

但你真的确定你需要这个奇怪的清单吗?

相关问题