将两个列表与LINQ进行比较

时间:2014-08-27 19:47:43

标签: c# linq

我们说我有这两个人名单。 Person对象具有FirstName,LastName和Age属性。

列出A

大卫史密斯,38岁 大卫史密斯,38岁 苏珊约翰逊,23岁

列表B

大卫史密斯,38岁 大卫史密斯,38岁 苏珊约翰逊,23岁 丹尼尔华莱士,55岁

我想通过比较三个属性来查看A是否是B的子集。不,在这种情况下,我没有每个人的唯一ID。

编辑:列表A中可能存在重复项(David Smith,38)。列表B应该具有重复项,以便有资格作为B的超集。

3 个答案:

答案 0 :(得分:6)

一旦你有一个实施IEquatable<T>IEqualityComparer<T>的课程,通过ExceptAny轻松完成剩下的工作:< / p>

if (collectionA.Except(collectionB).Any())
{
    // There are elements in A which aren't in B
}

if (collectionA.Except(collectionB, equalityComparer).Any())
{
    // There are elements in A which aren't in B
}

编辑:如果有重复项,您可能想要对每个集合进行分组,然后检查计数:

var groupedA = collectionA.GroupBy(p => p,
                                   (Value, g) => new { Value, Count = g.Count() });
var groupedB = collectionB.GroupBy(p => p,
                                   (Value, g) => new { Value, Count = g.Count() });
var extras = from a in groupedA
             join b in groupedB on a.Value equals b.Value into match
             where !match.Any() || a.Count > match.First().Count
             select a;

// ListA has at least one entry not in B, or with more duplicates than in B
if (extras.Any())
{
}

虽然这太可怕了......

答案 1 :(得分:2)

如果Person没有实施IEquatable<Person>&#34;蛮力&#34;方法是:

var isSubset = listA.All(pa => listB.Any(pb => pb.FirstName == pa.FirstName &&
                                               pb.LastName == pa.LastName &&
                                               pb.Age == pb.Age
                                        ) 
                        )

答案 2 :(得分:0)

您可以使用加入

var l1 = new List<Person>();//Subset 
var l2 = new List<Person>();//Set of all values

var res = from l1 in lst1
                      join l2 in lst2 
                      on l1.Value equals l2.Value
                      select new { result = l1 };

并比较count.If它是相等的,然后Set包含子集

bool flag = res.Count()==lst1.Count();