使用Linq检查集合是否完全包含子集,包括重复项。
使用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日
这里有另一个解决方案:\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);
我的想法是你可以通过计数将两个集合分组,然后测试超级组列表是否包含来自子组列表的每个键,并且在每种情况下,超级计数大于或等于相应的子计数。我认为我已经用以下方法实现了:
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);
我做了一些额外的测试,似乎可以工作,但你可以测试一些额外的数据集以确保。