代码之家  ›  专栏  ›  技术社区  ›  Elisabeth

当两个列表的特定属性小于其他属性时,返回“全部为真”

  •  3
  • Elisabeth  · 技术社区  · 7 年前

    很难解释,所以我在这里做了一个简化的数据示例:

    我这里有两张清单 不同的复合体 类型:

    List1:

    { 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,因为两个列表中的值属性的每个值都相等。

    如果值属性值中只有一个值不同,则整个结果必须为假。

    我该如何处理Linq Preferred?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Yurii N.    7 年前

    试试这个,用林肯的 Zip 方法:

    var result = list1.Zip(list2, (l1, l2) => l1.Value == l2.Value).All(x => x);
    
        2
  •  0
  •   Yeldar Kurmangaliyev    7 年前

    如果您需要执行此检查 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中应用其他比较逻辑 组联接 ,例如 outer.Value <= inners.Single().Value 检查是否所有值 item1 等于或小于中的相应值 item2 .

    注意,在这个实现中,如果在 list2 收集。如果您总是将异常排除在存在之外,那么您可能希望抛出异常。

        3
  •  0
  •   Vibeeshan Mahadeva    7 年前
    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;