为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
HUWWW 2021-11-28 16:28:22
很难解释,所以我在这里制作了一个简化的数据样本:我这里有 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 首选?
查看完整描述

3 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

试试这个,用 LINQ 的Zip方法:

var result = list1.Zip(list2, (l1, l2) => l1.Value == l2.Value).All(x => x);


查看完整回答
反对 回复 2021-11-28
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

如果您需要按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;

    }

}

您可以在 的最后一个 lambda 中应用其他比较逻辑GroupJoin,例如outer.Value <= inners.Single().Value检查 中的所有值item1是否等于或小于 中的相应值item2。


请注意,在此实现中,如果list2集合中没有具有此类 ID 的对象,它将返回 false 。如果你总是排除它存在,你可能想要抛出异常。


查看完整回答
反对 回复 2021-11-28
?
慕标5832272

TA贡献1966条经验 获得超4个赞

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;



查看完整回答
反对 回复 2021-11-28
  • 3 回答
  • 0 关注
  • 190 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信