很难解释,所以我在这里做一个简化的数据样本:
我在这里有2种不同复合物类型的列表:
列表1:
{ Id = 1 , Value = 1 }; {Id = 2 , Value = 2 }; { Id = 3 , Value = 1.5}
list2
{ Id = 1 , Value = 1 }; {Id = 2 , Value = 2 }; { Id = 3 , Value = 1.5}
两个列表的比较应该返回TRUE,因为两个列表中Value属性的每个值都相等。
如果“值”属性值之一不同,则整个结果必须为FALSE。
我如何用linq首选?
答案 0 :(得分:1)
使用LINQ的Zip方法进行尝试:
var result = list1.Zip(list2, (l1, l2) => l1.Value == l2.Value).All(x => x);
答案 1 :(得分:0)
如果您需要通过Id
属性执行此检查,那么您正在寻找GroupJoin
。
它使您可以按选择器对两个不同的集合进行分组,然后将它们加入:
bool ComplexCollectionValuesAreEqual(List<ComplexItem1> list1, List<ComplexItem2> list2)
{
try
{
var grouped = list1.GroupJoin(list2, x => x.Id, x => x.Id,
(outer, inners) => outer.Value == inners.Single().Value);
return grouped.All(x => x);
}
catch (InvalidOperationException) // for .Single() fail case
{
return false;
}
}
您可以在GroupJoin
的最后一个lambda中应用其他比较逻辑,例如outer.Value <= inners.Single().Value
,以检查item1
中的所有值是否等于或小于{{1}中的相应值}。
请注意,在item2
集合中,如果没有具有此类ID的对象,则在此实现中它将返回false。如果总是存在异常,则可能要抛出异常。
答案 2 :(得分:0)
bool isTrue = list1.Select((z, i) => z.Id != list2[i].Id || z.Value != list2[i].Value).Count() == 0;
如果未对集合进行排序
bool isTrue = list1.Where(x => list2.First(y => y.Id == x.Id).Value != x.Value ).Count() == 0;
如果项目不应该重复并且计数应该相等
bool isTrue = list1.Where(x => list2.First(y => y.Id == x.Id).Value == x.Value).Count() == list2.Count && list2.Count == list1.Count;