LINQ - 确定List是否包含List中的每个元素

时间:2014-08-27 04:18:15

标签: c# linq duplicates

我需要将两个列表与LINQ 进行比较,包括重复项。 似乎有一些类似的问题,但是,我一直在搜索,并且只找到忽略重复的方法 - 仅检查列表A是否包含列表B中的项目,使用Except或Intersect。我使用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));

无论List A的大小如何,我都需要它才能工作。

我希望我已经设法解释了这种情况。 在实际实现中,我正在针对类似于ListB的列表列表检查ListA,并创建一个新的“可能组合”列表。

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

您必须计算出现次数。

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);

答案 1 :(得分:0)

您可以像这样使用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;
  }
 }
}

提供here