我需要将两个列表与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,并创建一个新的“可能组合”列表。
感谢您的时间。
答案 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