比较两个List <myclass>:如何找出差异?</myclass>

时间:2011-12-07 12:53:47

标签: c# .net unit-testing mstest mongodb-.net-driver

我曾经比较这样的列表,但它在测试中返回false:

Assert.IsTrue(expected.SequenceEquals(actual));

尝试转换为json并且有效:

Assert.AreEqual(expected.ToJson(), actual.ToJson());

价值似乎是平等的,可能会有什么不同?如何找出列表中的不同之处?

已更新:

我的课程:

public class Department
{
    [BsonId]
    public ObjectId Id { get; set; }    
    public string Name { get; set; }            

    public override string ToString()
    {
        return Id.ToString();
    }
}

4 个答案:

答案 0 :(得分:5)

如果MyClass实施IEquatable<MyClass>,请尝试以下操作:

expected.Sort(); 
actual.Sort();
if (Enumerable.SequenceEqual(actual, expected)) { ... }

如果它没有实现IEquatable那么你会发现奇怪的行为,因为对象引用将在两个列表中进行比较,而不是它们的字段:

using System;
using System.Collections.Generic;
using System.Linq;

public class MyClassA
{
  private int i;
  public MyClassA(int i) { this.i = i; }
}

public class MyClassB : IEquatable<MyClassB>
{
  private int i;
  public MyClassB(int i) { this.i = i; }
  public bool Equals(MyClassB other) { return this.i == other.i; }
}

public class Program
{
  public static void Main()
  {
    var actual1 = new List<MyClassA>() { new MyClassA(1), new MyClassA(2), new MyClassA(3) };
    var expected1 = new List<MyClassA>() { new MyClassA(1), new MyClassA(2), new MyClassA(3) };
    Console.WriteLine(Enumerable.SequenceEqual(actual1, expected1));

    var a1 = new MyClassA(1);
    var a2 = new MyClassA(2);
    var a3 = new MyClassA(3);
    var actual2 = new List<MyClassA>() { a1, a2, a3 };
    var expected2 = new List<MyClassA>() { a1, a2, a3 };
    Console.WriteLine(Enumerable.SequenceEqual(actual2, expected2));

    var actual3 = new List<MyClassB>() { new MyClassB(1), new MyClassB(2), new MyClassB(3) };
    var expected3 = new List<MyClassB>() { new MyClassB(1), new MyClassB(2), new MyClassB(3) };
    Console.WriteLine(Enumerable.SequenceEqual(actual3, expected3));

    var actual4 = new List<MyClassB>() { new MyClassB(1), new MyClassB(2), new MyClassB(3) };
    var expected4 = new List<MyClassB>() { new MyClassB(3), new MyClassB(2), new MyClassB(1) };
    Console.WriteLine(Enumerable.SequenceEqual(actual4, expected4));
  }
}

输出:

False
True
True
False

答案 1 :(得分:3)

using System.Linq;

Enumerable.SequenceEqual(a, b);

// or SequenceEqual(a, b, StringComparer.OrdinalIgnoreCase)

请参阅MSDN,同时this question

答案 2 :(得分:0)

也许你可以使用IEnumerable.ExceptOf

http://msdn.microsoft.com/en-us/library/bb300779.aspx

我们也许您可以使用HashSet并使用intersect方法。 http://msdn.microsoft.com/en-us/library/bb293080.aspx

答案 3 :(得分:0)

我倾向于找到适合此类目的的HashSet<T>集合,将您的集合投放到HashSet<T>然后调用SetEquals