我们说我有这两个人名单。 Person对象具有FirstName,LastName和Age属性。
我想通过比较三个属性来查看A是否是B的子集。不,在这种情况下,我没有每个人的唯一ID。
编辑:列表A中可能存在重复项(David Smith,38)。列表B应该具有重复项,以便有资格作为B的超集。
答案 0 :(得分:6)
一旦你有一个实施IEquatable<T>
或IEqualityComparer<T>
的课程,通过Except
和Any
轻松完成剩下的工作:< / 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();