2011-04-15 79 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; 
     } 
    }