2011-12-07 107 views
2

我用來比較列表這樣的,但它在測試返回false:比較兩個列表<MyClass>:如何找出差異?

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(); 
    } 
} 
+1

您需要檢查序列只包含相同的元素,或者也可以以相同的順序? – abatishchev

+1

嘗試[C#比較兩個列表的差異](http://stackoverflow.com/questions/675699/c-sharp-compare-two-lists-for-differences) –

+0

我只需要比較值。但有趣的是:爲什麼當對象的值相等時,列表中的順序是相等的,SequenceEquals返回false。 – 1gn1ter

回答

4

如果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 
+0

是的,OP的主要問題是:他的「T」是什麼? – abatishchev

+0

T是我的自定義類,它只有屬性和覆蓋ToString()我可以發佈類的代碼 – 1gn1ter

+0

@ 1gn1ter:請發佈你的列表的內容。 – abatishchev

3
using System.Linq; 

Enumerable.SequenceEqual(a, b); 

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

MSDN,也this question

+1

它與預期相同.SequenceEquals(實際) – 1gn1ter

+0

@ 1gn1ter:是的,它是 – abatishchev

0

我傾向於找HashSet<T>收集適合於這種目的的,投你收藏到HashSet<T>然後調用SetEquals