我有两个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;
}
我还需要在第二个列表中打印出不适合或没有配对的项目
由于
答案 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);