C# 使用LINQ比较两个列表
假设我有这两张名单。Person对象具有FirstName、LastName和Age属性 列举 大卫·史密斯,38岁 大卫·史密斯,38岁 苏珊·约翰逊,23岁 名单B 大卫·史密斯,38岁 大卫·史密斯,38岁 苏珊·约翰逊,23岁 丹尼尔·华莱士,55岁 我想通过比较这三个属性来确定A是否是B的子集。不,在这种情况下,我没有每个人的唯一IDC# 使用LINQ比较两个列表,c#,linq,C#,Linq,假设我有这两张名单。Person对象具有FirstName、LastName和Age属性 列举 大卫·史密斯,38岁 大卫·史密斯,38岁 苏珊·约翰逊,23岁 名单B 大卫·史密斯,38岁 大卫·史密斯,38岁 苏珊·约翰逊,23岁 丹尼尔·华莱士,55岁 我想通过比较这三个属性来确定A是否是B的子集。不,在这种情况下,我没有每个人的唯一ID 编辑:列表A中可能有重复项(David Smith,38)。列表B应具有重复项,以符合B的超级集合的资格。如果人员未实现IEquatable则“暴力”方
编辑:列表A中可能有重复项(David Smith,38)。列表B应具有重复项,以符合B的超级集合的资格。如果
人员
未实现IEquatable
则“暴力”方法为:
var isSubset = listA.All(pa => listB.Any(pb => pb.FirstName == pa.FirstName &&
pb.LastName == pa.LastName &&
pb.Age == pb.Age
)
)
一旦你有了一个实现了
IEquatable
或IEqualityComparer
的类,那么除了和任何
之外,其余的工作都很容易完成:
if (collectionA.Except(collectionB).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())
{
}
这是非常可怕的…您可以使用join
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 };
还有其他房产吗?Person
是否恰当地实现了IEquatable
?我的类不完全是Person。但是没有,我正在读关于IEquatable的书。那么我使用什么LINQ操作符呢?包含?这对副本有效吗?我把原来的帖子改成了重复的。要使列表B有资格成为a的超集,它需要有所有的副本。所以你的意思是,如果列表a包含“David Smith,38”三次,那么列表B也需要包含至少三次?是的。我知道这是个可怕的例子。但在我的情况下,B需要包含所有的重复项。@user79284:在我的答案中尝试编辑-但可能有更简单的方法。(在未来,请首先包括这样的重要细节。)
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 };
bool flag = res.Count()==lst1.Count();