我不知道我在哪里犯了错误,但我无法比较两个(例如)整数列表的列表。
简单示例:
List<List<int>> A = new List<List<int>>();
A.Add(new List<int>(new int[] { 1 }));
A.Add(new List<int>(new int[] { 2 }));
List<List<int>> B = new List<List<int>>();
B.Add(new List<int>(new int[] { 1 }));
if (A.Contains(B[0])){
Console.WriteLine("TRUE");
else{
Console.WriteLine("FALSE");
}
返回False。在这种情况下比较的正确方法是什么?我也尝试了Intersect
和Except
同样的结果。
答案 0 :(得分:3)
你可以遍历A中的每个列表并将其与{[3}}的B [0]进行比较:
if (A.Any(list => list.SequenceEqual(B[0])))
{
Console.WriteLine("TRUE");
}
else
{
Console.WriteLine("FALSE");
}
将返回true
答案 1 :(得分:3)
bool contains = A.Any(a => B.Any(b => b.OrderBy(x => x)
.SequenceEqual(a.OrderBy(x => x))));
[[1],[2]] and [[3]] => false
[[1],[2]] and [[1]] => true
[[2],[1]] and [[1],[2]] => true
[[3],[4]] and [[1],[2]] => false
[[1,2],[3]] and [[2,1],[4]] => true
答案 2 :(得分:2)
这可能有助于形象化:
A:
A[0]:
A[0][0]: 1
A[1]:
A[1][0]: 2
B:
B[0]:
B[0][0]: 1
当您致电A.Contains()
时,您会询问您正在测试的内容是A[0]
还是A[1]
。由于您传递的是B
,B
不是这两个,因此返回false。即使你传递B[0]
或B[0][0]
,你仍然会得到错误,因为这些与A[0]
或{{相同的对象 1}}。
A[1]
是测试两个SequenceEqual()
的内容是否相同的函数。因此,您要测试List
或A[0]
是A[1]
到SequenceEqual
(即B[0]
还是A[0][0] == B[0][0]
)。
执行此操作的最佳方法是使用LINQ函数A[1][0] == B[0][0]
。 .Any()
会针对A.Any(a => a.SequenceEqual(B[0]))
中的所有内容测试B[0]
。如果您要将所有 A
元素与所有 B
元素进行比较,则需要更像A
的内容。这可以翻译为:
A.Any(a => B.Any(b => a.SequenceEqual(b))
答案 3 :(得分:0)
对于string以外的引用类型,如果两个操作数引用同一个对象,则operator ==返回true。显然不是这里你要将一个列表引用与另一个列表引用进行比较。
答案 4 :(得分:0)
您正在比较列表,默认情况下会比较列表的参考相等性。
对于这种特殊情况,您可以通过以下方式使用SequenceEqual
扩展名:
bool contains = A.Any(a => a.SequenceEqual(B[0]));
Console.WriteLine(contains);
这可能或可能不足以达到您的目的:)
另一种解决方法是在IEqualityComparer
周围编写自己的SequenceEqual
包装,如下所述:IEqualityComparer for SequenceEqual
然后将其用作.Contains
来电中的参数。