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

时间:2018-08-14 14:38:34

标签: c# linq

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

我在这里有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首选?

3 个答案:

答案 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;