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来代替列表