我有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个列表),并且只包含四个列表。
答案 0 :(得分:2)
所有算术如20
,10 + 10
,5 + 15
,2 + 18
和18 + 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。
答案 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。