检查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>
的内容,所以我正在寻找另一种方法来确定等价。
答案 0 :(得分:5)
试试这个:
test.Any(x => x.All(b.Contains));
这将返回true
,但这不完全正确。如果true
包含的元素多于b
(例如1,2,3,4,5,6
等),它也会返回7,8,9
。要解决此问题,您可以尝试SequenceEqual
:
test.Any(x => x.OrderBy(y => y)
.SequenceEqual(b.OrderBy(z => z)));
如果您不希望true
在b
无序(例如2,1,3,4,5,6
)时返回OrderBy
,请不要使用SequenceEqual
;只需使用test.Any(x => x.SequenceEqual(b));
:
{{1}}
答案 1 :(得分:0)
列表的相等性通过引用而不是按值进行比较,因此test.Contains(b)
为false,因为a == b
为false。但是有一个运算符SequenceEqual
会根据内容比较两个列表,因此在您的示例中a.SequenceEqual(b)
为真,因此您可以这样做:
test.Any(x => x.SequenceEqual(b))
将返回true。