比较两个复杂对象的相等性

时间:2012-12-03 06:29:08

标签: c# .net

我有两个List,这个复杂的对象有4个引用类型的公共属性。 如何将一个列表与另一个列表进行比较,以查找这些列表的大小和值是否相等。

我在ComplexObject中实现了Equals以帮助进行相等检查

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;
}

我还需要在第二个列表中打印出不适合或没有配对的项目

由于

4 个答案:

答案 0 :(得分:1)

如果您先对两个列表进行排序,则可以使用 SequencyEqual 扩展方法检查两个序列是否相等。此方法是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)

列表最简单的方法是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;
}

答案 2 :(得分:0)

查看IEqualityComparer(T)。 您实现了接口成员,如果您使用LINQ,它将工作,您应该能够AND列表。 http://msdn.microsoft.com/en-us/library/ms132151.aspx

答案 3 :(得分:0)

您可以使用 SequenceEqual(List1,List2)

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