C# 检查列表是否<;列表<;int>&燃气轮机;包含列表<;int>;

C# 检查列表是否<;列表<;int>&燃气轮机;包含列表<;int>;,c#,list,C#,List,检查列表是否包含列表的最佳方法是: 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)); List test=n

检查
列表
是否包含
列表
的最佳方法是:

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));
List test=newlist();
列表a=新列表{1,2,3,4,5,6};
列表b=新列表{1,2,3,4,5,6};
测试。添加(a);
Log(test.Contains(b));
我知道
Contains()
不会检查
列表的内容,所以我正在寻找另一种确定等效性的方法。

试试以下方法:

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)));
test.Any(x => x.SequenceEqual(b));
如果您不希望在
b
无序时返回
true
(例如
2,1,3,4,5,6
),则不要使用
OrderBy
;只需使用
SequenceEqual

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

列表的相等性是通过引用而不是通过值进行比较的,因此
test.Contains(b)
为false,原因与
a==b
为false相同。但是有一个操作符
SequenceEqual
,它将根据两个列表的内容对它们进行比较,这样在您的示例中
a.SequenceEqual(b)
是真的,因此您可以执行以下操作:

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

这将返回true。

在您的情况下,顺序是否重要?例如,a=新列表{1,2,3,4,5,6}和b=新列表{1,2,4,3,5,6}应返回true或false?+1以区分包含项和包含项,仅此而已。非常感谢!最后我使用了一个无序列表,所以感谢这两种解决方案,你让我开心了:-)当然,如果这是一个常见的情况,你可能需要使用HashSet或SortedSet来代替列表