假设我有这两个人员列表。Person对象具有FirstName、LastName和Age属性。
A表
大卫·史密斯,38岁,大卫·史密斯,38岁,苏珊·约翰逊,23岁
列表B
大卫·史密斯,38岁,大卫·史密斯,38岁,苏珊·约翰逊,23岁,丹尼尔·华莱士,55岁
我想通过比较这三个属性来看看A是否是B的子集。不,在这种情况下,我没有为每个人提供唯一的ID。
编辑:列表A中可以有重复项(David Smith,38)。列表B应该有重复项才有资格成为B的超集。
发布于 2014-08-28 03:56:00
一旦获得了实现IEquatable<T>或IEqualityComparer<T>的类,就很容易用Except和Any完成剩下的工作
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())
{
}这是相当可怕的。
发布于 2014-08-28 03:52:22
如果Person没有实现IEquatable<Person>,那么“暴力破解”方法将是:
var isSubset = listA.All(pa => listB.Any(pb => pb.FirstName == pa.FirstName &&
pb.LastName == pa.LastName &&
pb.Age == pb.Age
)
)发布于 2014-08-28 18:22:19
可以使用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 };并且比较count.If是相等的,那么集合包含子集
bool flag = res.Count()==lst1.Count();https://stackoverflow.com/questions/25535782
复制相似问题