如何在我的列表<列表>对象

本文关键字:列表 对象 int 我的 | 更新日期: 2023-09-27 18:14:29

我有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个列表),并且只包含四个列表。

如何在我的列表<列表<int>>对象

2010 + 105 + 152 + 1818 + 2等算术运算将在编译时计算,因此,在运行时,无法区分20

但是,您可以将designsum (18 + 2)更改为just 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

如果可能的话,考虑回顾您试图解决的问题。复杂性至少可以减少到列表中。

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

参见:在。net中只允许唯一项的集合?

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

考虑以下语句:

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

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

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

这是一个包含单个元素20的列表。你的其他清单也是。


现在让我假设这不是您想要的,您想要的是实例化列表,其中花括号中的所有元素都是列表的一部分。为了做到这一点,你必须用逗号将它们分开,所以编译器现在将它们视为单独的元素,而不使用求和操作符,实际上是将它们相加。

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

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

有很多种方法可以做到这一点,但现在我想你应该熟悉列表的工作原理,然后你应该继续前进,发现你正在寻找的答案在这里