猿问

当特定属性小于两个列表的其他属性时,为 ALL 返回 TRUE

很难解释,所以我在这里制作了一个简化的数据样本:

我这里有 2 个不同复杂类型的列表:

清单 1:

{ Id = 1 , Value = 1 }; {Id = 2 ,  Value = 2 }; { Id = 3 , Value = 1.5}

列表2

{ Id = 1 , Value = 1 }; {Id = 2 ,  Value = 2 }; { Id = 3 , Value = 1.5}

两个列表的比较应返回 TRUE,因为 Value 属性的每个值在两个列表中都相等。

如果仅 Value 属性值之一不同,则整个结果必须为 FALSE。

我怎样才能用 linq 首选?


HUWWW
浏览 191回答 3
3回答

牧羊人nacy

试试这个,用 LINQ 的Zip方法:var result = list1.Zip(list2, (l1, l2) => l1.Value == l2.Value).All(x => x);

凤凰求蛊

如果您需要按Id属性执行此检查,那么GroupJoin这就是您要查找的内容。它允许您按选择器对两个不同的集合进行分组,然后加入它们:bool ComplexCollectionValuesAreEqual(List<ComplexItem1> list1, List<ComplexItem2> list2){&nbsp; &nbsp; try&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var grouped = list1.GroupJoin(list2, x => x.Id, x => x.Id,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (outer, inners) => outer.Value == inners.Single().Value);&nbsp; &nbsp; &nbsp; &nbsp; return grouped.All(x => x);&nbsp; &nbsp; }&nbsp; &nbsp; catch (InvalidOperationException) // for .Single() fail case&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; }}您可以在 的最后一个 lambda 中应用其他比较逻辑GroupJoin,例如outer.Value <= inners.Single().Value检查 中的所有值item1是否等于或小于 中的相应值item2。请注意,在此实现中,如果list2集合中没有具有此类 ID 的对象,它将返回 false 。如果你总是排除它存在,你可能想要抛出异常。

慕标5832272

bool&nbsp;isTrue&nbsp;=&nbsp;list1.Select((z,&nbsp;i)&nbsp;=>&nbsp;z.Id&nbsp;!=&nbsp;list2[i].Id&nbsp;||&nbsp;z.Value&nbsp;!=&nbsp;list2[i].Value).Count()&nbsp;==&nbsp;0;如果集合未排序bool&nbsp;isTrue&nbsp;=&nbsp;list1.Where(x&nbsp;=>&nbsp;&nbsp;list2.First(y&nbsp;=>&nbsp;y.Id&nbsp;==&nbsp;x.Id).Value&nbsp;!=&nbsp;x.Value&nbsp;).Count()&nbsp;==&nbsp;0;如果项目不应有重复项且计数应相等bool&nbsp;isTrue&nbsp;=&nbsp;list1.Where(x&nbsp;=>&nbsp;list2.First(y&nbsp;=>&nbsp;y.Id&nbsp;==&nbsp;x.Id).Value&nbsp;==&nbsp;x.Value).Count()&nbsp;==&nbsp;list2.Count&nbsp;&&&nbsp;list2.Count&nbsp;==&nbsp;list1.Count;
随时随地看视频慕课网APP
我要回答