如何删除列表中的重复列表<list <int>&gt;宾语?

时间:2016-10-24 07:30:40

标签: c#

我有List<List<int>>对象

var lists = new List<List<int>>
{
    new List<int> { 20 },
    new List<int> { 10, 10 },
    new List<int> { 5, 15 },
    //next two lists should be considered as equals and 
    //one of this should be removed from main list
    new List<int> { 2, 18 },
    new List<int> { 18, 2 },
};

现在我要删除lists中的重复内容。例如,结果列表应删除一个(第4或第5个列表),并且只包含四个列表。

3 个答案:

答案 0 :(得分:2)

所有算术如2010 + 105 + 152 + 1818 + 2都将在编译时计算, 所以在运行时,你无法区分20彼此。

但是,您可以将设计总和18 + 2)更改为 tems 18, 2):

// please, notice commas instead of +'s 
var lists = new List<List<int>>() {
  new List<int> { 20 },
  new List<int> { 10, 10 },
  new List<int> {  5, 15 },
  new List<int> {  2, 18 },
  new List<int> { 18,  2 },
}; 

在这种情况下,您可以实施重复删除

// simplest, providing that list doesn't contain null's
for (int i = 0; i < lists.Count; ++i) {
  // since we want to compare sequecnes, we shall ensure the same order of their items
  var item = lists[i].OrderBy(x => x).ToArray();

  for (int j = lists.Count - 1; j > i; --j)
    if (item.SequenceEqual(lists[j].OrderBy(x => x)))
      lists.RemoveAt(j);
}

测试

var result = lists.Select(line => string.Join(" + ", line));
Console.Write(string.Join(Environment.NewLine, result));

输出

20
10 + 10
5 + 15
2 + 18

答案 1 :(得分:0)

如果可能,请考虑查看您要解决的问题。复杂性至少可能会降低到列表中。

确保集合包含唯一值的最简单方法之一是使用HashSet。

请参阅:Collection that allows only unique items in .NET?

答案 2 :(得分:0)

首先,在继续搜索如何删除列表列表中的重复项之前,我想您应该更好地了解列表是什么,以及它是如何表示的。

请考虑以下声明:

var list = new List<int> { 10 + 10 };

这里发生的是算术运算(10 + 10)在构造列表之前执行,因此你得到一个等价语句:

var list = new List<int> { 20 };

这是一个包含单个元素20的列表。所有其他清单也是如此。

现在让我假设这不是你想要的,你想要的是你用花括号中的所有元素作为列表的一部分来实例化列表。为了做到这一点,你必须用逗号分隔它们,所以编译器现在它们是单独的元素,而不是使用sum运算符,它实际上是对它们进行求和。

var list = new List<int> { 10, 10 };

此语句创建一个包含两个元素10 and 10的列表。

他们有多种方法可以做到这一点,但是现在我想你应该熟悉这些列表是如何工作的,然后你应该继续前进,找到你正在寻找的答案是here