首页 > 解决方案 > 检查列表“A”是否包含列表“B”中的每个元素

问题描述

听起来好像以前有人问过这个答案,但不一样。我正在寻找一种方法来检查列表“A”是否包含列表“B”中的所有元素,我从这个问题中得到了答案:Does .NET have a way to check if List a contains all items in List b ? . 不管怎样,我对这个解决方案有疑问。

我的列表“A”可以有一系列Item对象,列表 B 也可以,如果列表 B 包含 2 次相同的对象并且我的列表“A”为 1 或更少,我希望我的代码返回 false。这段代码(取自正确答案):

return !RequiredItems.Except(Application._player.InventoryItems).Any();

仅检查元素是否在列表“A”中至少存在一次。例子:

清单 A:汽车

清单 B:汽车,汽车

将返回 true,因为 List A 包含一辆汽车,即使我希望它返回 false,除非它有 2 辆汽车。

有没有办法修改该代码以制作我想要的东西,或者有另一种方法来实现这一点?

编辑: @HimBromBeere 让我意识到我忘了说一些非常重要的事情。列表 A 需要至少具有相同数量的元素才能实现目标。如果此列表 A 包含 1000 辆汽车,而列表 B 仅包含 B,则它应该返回 true。如果列表 A 在列表 B 中包含较少或没有元素(包括重复项),则它只能返回 false。

标签: c#

解决方案


我可以想象这样一种基于循环的方法:

bool areEqual = true;
foreach(var g in listB.GroupBy(x => x))
{
    if(listA.Count(x => x == g.Key) >= g.Count())
    {
        areEqual = false;
        break;
    }
}

它对 的所有重复项进行分组,listB并检查它们的数量是否至少是来自 的相等项目的数量listA

这当然假设您的重复项的引用相等。否则你将不得不实施一些平等检查。


推荐阅读