检查 List<List<int>> 是否包含 List<int>

3

如何检查 List<List<int>> 中是否包含一个 List<int>,最好的方法是什么?

List<List<int>> test = new List<List<int>>();
List<int> a = new List<int>{1,2,3,4,5,6};
List<int> b = new List<int>{1,2,3,4,5,6};
test.Add(a);
Debug.Log(test.Contains(b));

我知道Contains()不会检查List<T>内容,因此我正在寻找确定等效性的另一种方法。


1
在你的情况下,顺序是否重要?例如a = new List<int>{1,2,3,4,5,6}和b = new List<int>{1,2,4,3,5,6}应该返回true还是false? - Uriil
2个回答

7

试试这个:

test.Any(x => x.All(b.Contains));

这将返回true,但并不完全正确。如果b包含比1,2,3,4,5,6更多的元素(例如7,8,9等),它也会返回true。要解决这个问题,您可以尝试使用SequenceEqual

test.Any(x => x.OrderBy(y => y)
    .SequenceEqual(b.OrderBy(z => z)));

如果你不希望在 b 是无序的情况下返回 true(例如 2,1,3,4,5,6),那么就不要使用 OrderBy;而是使用 SequenceEqual

test.Any(x => x.SequenceEqual(b));

1
+1 是为了区分包含和仅包含指定项,不多也不少。 - Michael
最终我使用了一个无序列表,所以感谢你们提供的两种解决方案,你们让我的一天变得美好 :-) - thalitus
当然,如果这是一个常见的情况,你可能想使用 HashSet 或 SortedSet 而不是 List。 - Billy ONeal

0
列表的相等性是通过引用而不是值进行比较的,因此对于相同的原因,test.Contains(b)为false,a == b也为false。但是有一个运算符SequenceEqual,它将比较两个列表的内容,因此在您的示例中a.SequenceEqual(b)为true,因此您可以这样做:
test.Any(x => x.SequenceEqual(b))

将返回true。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接