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的列表列表进行比较,并创建一个新的"可能组合"列表。

谢谢你抽出时间。

LINQ-确定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;
  }
 }
}

此处提供