2012-12-03 64 views
1

我有兩個List,這個複雜對象有4個引用類型的公共屬性。 如何將一個列表與另一個列表進行比較,以查找這些列表的大小和值是否相等。比較兩個複雜對象的相等性

我已經實現的equals ComplexObject爲了幫助平等檢查

public Type1 Type1 { get; set; } 
public IEnumerable<Type2> Type2s{ get; set; } 
public Type3 Type3{ get; set; } 
public Type4 Type4 { get; set; } 

public bool Equals(ComplexObject complexObject) 
{ 
    int type2sCount = Type2s.Count(); 
    return Type1 .Equals(complexObject.Type1) && 
     Type3.Equals(complexObject.Type3) && 
     Type4.Equals(complexObject.Type4) && 
     Type2s.Intersect(complexObject.Type2s).Count() == type2sCount; 
} 

我也需要打印出做不適合或在第二列表中沒有對

由於項目

回答

1

的名單最簡單的方法是SequenceEqual,但你必須要小心null S:

public bool Equals(ComplexObject complexObject) 
{ 
    bool eq = Equals(Type1, complexObject.Type1) 
     && Equals(Type3, complexObject.Type3) 
     && Equals(Type4, complexObject.Type4); 
    if (eq) 
    { 
     if(Type2s == null) 
     { 
      if(complexObject.Type2s != null) eq = false; 
     } else { 
      eq = complexObject.Type2s == null ? false 
       : Type2s.SequenceEqual(complexObject.Type2s); 
     } 
    } 
    return eq; 
} 
+0

我應該使用這種方法排序嗎? – eugeneK

+0

@eugeneK取決於......你認爲他們是「集合」還是「序列」?我建議序列{1,2,3} **不等於序列{1,3,2},但是如果我們將它們看作* sets *:它們是。無論如何,我不會做任何排序。如果我們將它們當作*集合*,我可能會使用'HashSet '緩衝區或其他東西。當然,如果您認爲'{1,1,2,3}'與{1,2,3}'不同,那麼就會變得棘手,因爲如果我們將它們當作集合來對待:它們是相同的。 –

+0

這些都是集合,所以我可以使用您的Equals建議以及@Charlie - BlokeTech的答案。除非有更好的解決方案。我無法得到如何HasSet 會幫助我。 – eugeneK

1

如果您先對兩個列表進行排序,則可以使用SequentEqual擴展方法來檢查兩個序列是否相等。此方法是System.Linq的一部分。

下面是一個例子:

List<ComplexObject> list1 = new List<ComplexObject>(); 
    List<ComplexObject> list2 = new List<ComplexObject>(); 

    IOrderedEnumerable<ComplexObject> list1Sorted = list1.OrderBy(item => item.SomeProperty); 
    IOrderedEnumerable<ComplexObject> list2Sorted = list2.OrderBy(item => item.SomeProperty); 

    bool areEqual = list1Sorted.SequenceEqual(list2Sorted); 
+1

這也取決於您是否將序列「{1,2,3}」和「{1,3,2}」視爲「相等」......有時您會這樣做,有時您不會。 –

0

檢查出的IEqualityComparer(T)。 你實現了界面成員,如果你使用的是LINQ,它會起作用,你應該能夠和列表。 http://msdn.microsoft.com/en-us/library/ms132151.aspx

+0

有沒有任何通用比較器,所以我可以使用它的其他類型的對象? – eugeneK

+0

@eugeneK是:'EqualityComparer .Default' –

0

你可以利用SequenceEqual的(列表1,列表2)

bool equal = Type2s.SequenceEqual(complexObject.Type2s);