C#比较两个对象列表

时间:2014-02-20 20:26:59

标签: c# list compare

我不知道我在哪里犯了错误,但我无法比较两个(例如)整数列表的列表。

简单示例:

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。在这种情况下比较的正确方法是什么?我也尝试了IntersectExcept同样的结果。

5 个答案:

答案 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]。由于您传递的是BB不是这两个,因此返回false。即使你传递B[0]B[0][0],你仍然会得到错误,因为这些A[0]或{{相同的对象 1}}。

A[1]是测试两个SequenceEqual()的内容是否相同的函数。因此,您要测试ListA[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来电中的参数。