LINQ-确定ListA是否包含ListB中的每个元素
本文关键字:元素 ListB 确定 ListA 是否 包含 LINQ- | 更新日期: 2023-09-27 18:19:28
我需要用LINQ比较两个列表,包括重复项。然而,似乎有很多类似的问题,我一直在搜索,只找到了忽略重复的方法——只使用Except或Intersect检查列表a是否包含列表B中的项目。我使用OrderBy和SequenceEquals取得了一些成功,但只有当列表大小相同时,它才会起作用。
List<Animal> ListA;
List<Animal> ListB;
// This works..
ListA = { Dog, Dog, Dog, Cat, Mouse }
ListB = { Dog, Dog, Dog, Cat, Mouse }
// However, this does not..
ListA = { Dog, Dog, Dog, Cat, Mouse, Mouse }
ListB = { Dog, Dog, Dog, Cat, Mouse }
var result = ListA.OrderBy(animal => animal)
.SequenceEqual(ListB.OrderBy(animal => animal));
无论列表A的大小,我都需要它来工作。
我希望我已经设法解释了情况。在实际实现中,我将ListA与类似于ListB的列表列表进行比较,并创建一个新的"可能组合"列表。
谢谢你抽出时间。
您必须计算出现次数。
static bool IsSubsetWithDuplicates<T>(IEnumerable<T> superset, IEnumerable<T> subset)
{
var supersetLookup = superset.ToLookup(a => a);
foreach (var subsetGroup in subset.ToLookup(a => a))
{
if(subsetGroup.Count() > supersetLookup[subsetGroup.Key].Count())
{
return false;
}
}
return true;
}
呼叫代码:
var result1 = IsSubsetWithDuplicates(ListA, ListB);
var result2 = IsSubsetWithDuplicates(ListA1, ListB1);
var result3 = IsSubsetWithDuplicates(ListB1, ListA1);
您可以使用类似的Extension方法
public static IEnumerable<T> IntersectDuplicates<T>(this IEnumerable<T> source, IEnumerable<T> target)
{
List<T> list = target.ToList();
foreach (T item in source)
{
if (list.Contains(item))
{
list.Remove(item);
yield return item;
}
}
}
此处提供