首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LINQ比较两个列表

使用LINQ比较两个列表
EN

Stack Overflow用户
提问于 2014-08-28 03:47:43
回答 3查看 157关注 0票数 0

假设我有这两个人员列表。Person对象具有FirstName、LastName和Age属性。

A表

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

列表B

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

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

编辑:列表A中可以有重复项(David Smith,38)。列表B应该有重复项才有资格成为B的超集。

EN

回答 3

Stack Overflow用户

发布于 2014-08-28 03:56:00

一旦获得了实现IEquatable<T>IEqualityComparer<T>的类,就很容易用ExceptAny完成剩下的工作

代码语言:javascript
复制
if (collectionA.Except(collectionB).Any())
{
    // There are elements in A which aren't in B
}

代码语言:javascript
复制
if (collectionA.Except(collectionB, equalityComparer).Any())
{
    // There are elements in A which aren't in B
}

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

代码语言:javascript
复制
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())
{
}

这是相当可怕的。

票数 6
EN

Stack Overflow用户

发布于 2014-08-28 03:52:22

如果Person没有实现IEquatable<Person>,那么“暴力破解”方法将是:

代码语言:javascript
复制
var isSubset = listA.All(pa => listB.Any(pb => pb.FirstName == pa.FirstName &&
                                               pb.LastName == pa.LastName &&
                                               pb.Age == pb.Age
                                        ) 
                        )
票数 2
EN

Stack Overflow用户

发布于 2014-08-28 18:22:19

可以使用join

代码语言:javascript
复制
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是相等的,那么集合包含子集

代码语言:javascript
复制
bool flag = res.Count()==lst1.Count();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25535782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档