如何在我的列表<列表>对象
本文关键字:列表 对象 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个列表),并且只包含四个列表。
20
、10 + 10
、5 + 15
、2 + 18
、18 + 2
等算术运算将在编译时计算,因此,在运行时,无法区分20
。
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
。
有很多种方法可以做到这一点,但现在我想你应该熟悉列表的工作原理,然后你应该继续前进,发现你正在寻找的答案在这里