使用Linq检查集合是否完全包含子集,包括重复项。

25 浏览
0 Comments

使用Linq检查集合是否完全包含子集,包括重复项。

var subset = new[] { 9, 3, 9 };
var superset = new[] { 9, 10, 5, 3, 3, 3 };
subset.All(s => superset.Contains(s))

这段代码将返回true,因为9包含在超集中,但只出现一次。我希望有一种实现可以考虑到重复,所以它将返回false。

admin 更改状态以发布 2023年5月21日
0
0 Comments

这里有另一个解决方案:\n

            var subset = new[] { 9, 3, 9 };
            var superset = new[] { 9, 10, 5, 3, 3, 3 };
            var subsetGroup = subset.GroupBy(x => x).Select(x => new { key = x.Key, count = x.Count() });
            var supersetDict = superset.GroupBy(x => x).ToDictionary(x => x.Key, y => y.Count());
            Boolean results = subsetGroup.All(x => supersetDict[x.key] >= x.count);

0
0 Comments

我的想法是你可以通过计数将两个集合分组,然后测试超级组列表是否包含来自子组列表的每个键,并且在每种情况下,超级计数大于或等于相应的子计数。我认为我已经用以下方法实现了:

var subset = new[] { 9, 3, 9 };
var superset = new[] { 9, 10, 5, 3, 3, 3 };
var subGroups = subset.GroupBy(n => n).ToArray();
var superGroups = superset.GroupBy(n => n).ToArray();
var basicResult = subset.All(n => superset.Contains(n));
var advancedResult = subGroups.All(subg => superGroups.Any(supg => subg.Key == supg.Key && subg.Count() <= supg.Count()));
Console.WriteLine(basicResult);
Console.WriteLine(advancedResult);

我做了一些额外的测试,似乎可以工作,但你可以测试一些额外的数据集以确保。

0