2011-04-15 78 views
0

基本上,我有一個包含多個字段的結構。我將創建兩個包含此結構實例的列表,並且我需要能夠檢查兩個列表是否相同(即相同數量的結構並且所有字段的值相同)。比較具有不同引用的2個列表(C#)

我正在查看SequenceEqual運算符,但依賴於列表中具有相同引用的項目 - 它們不會,它們都來自不同的來源。

我可以通過字段排序列表,循環列表中的每個項目,然後遍歷列表中的每個字段/屬性,並查看它是否與另一個列表中的匹配 - 但它似乎有點過於複雜。有更容易的方法嗎?

回答

4

SequenceEqual運算符使用比較器而不是通過引用序列進行比較。

MSDN:「通過使用默認相等比較器對它們的類​​型比較元素,確定兩個序列是否相等。」

使用SequenceEqual並執行IEqualityComparer,你應該沒問題。

var areSame = list1.SequenceEqual(list2, new MyStructComparer()); 

class MyStructComparer : IEqualityComparer<MyStruct> { 
    public bool Equals(MyStruct x, MyStruct y) { 
     if (Object.ReferenceEquals(x, y)) 
      return true; 
     if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) 
      return false; 
     return x.A == y.A && x.B == y.B; 
    } 

    public int GetHashCode(MyStruct myStruct) 
    {   
     if (Object.ReferenceEquals(myStruct, null)) 
      return 0; 

     int hashMyStructA = myStruct.A == null ? 0 : myStruct.A.GetHashCode(); 
     int hashMyStructB = myStruct.B == null ? 0 : myStruct.B.GetHashCode(); 

     return hashMyStructA^hashMyStructB; 
    } 
} 
+0

這意味着他還需要提供自己的`equals()方法的結構`方法。他可以先用usign'first.All(i => second.Any(x => x.Id.equals(i.Id)));` – 2011-04-15 15:22:23

1

您可以覆蓋Equals(),並在那裏所有的屬性比較,如果他們都是平等返回true。

public struct MyStruct 
    { 

     public int A; 
     public int B; 

     public override bool Equals(object obj) 
     { 
      MyStruct other = (MyStruct) obj; 
      return A == other.A && B == other.B; 
     } 
    } 

對於名單的平等,我會寫一個擴展方法:

public static class MyStructExtension 
    { 
     public static bool ListsEqual(this IList<MyStruct> a, IList<MyStruct> b) 
     { 
      if(a==b) 
       return true; 
      if (a == null || b == null) 
       return false; 
      if (a.Count != b.Count) 
       return false; 
      for (int i = 0; i < a.Count; i++) 
      { 
       if (!a[i].Equals(b[i])) 
        return false; 
      } 

      return true; 
     } 
    }