2

我有两个 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

4 回答 4

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);
于 2012-12-03T06:32:25.753 回答
1

列表的最简单方法是SequenceEqual,但您需要小心nulls:

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;
}
于 2012-12-03T06:35:32.423 回答
0

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

于 2012-12-03T06:33:11.523 回答
0

您可以使用SequenceEqual(List1, List2)

  bool equal = Type2s.SequenceEqual(complexObject.Type2s);
于 2012-12-03T06:36:42.847 回答