使用 LinQ 代码检索布尔值结果

本文关键字:布尔值 结果 检索 代码 LinQ 使用 | 更新日期: 2023-09-27 18:21:00

如果披萨的成分存在于allIngred中,则结果将使用 LINQ 给出true。我将如何做到这一点?

string[] allIngred = {
    "oil", "yeast", "wheat-flour", "salt", "oil", "baking-powder",
    "wheat-flour", "salt", "sugar", "milk"
};
string[] pizza = { "oil", "yeast", "wheat-flour", "salt" };

使用 LinQ 代码检索布尔值结果

您可以使用 AllContains 方法的组合来检查pizza中的所有项目是否存在于allIngred

bool result = pizza.All(i => allIngred.Contains(i));

我不是 100% 确定你的意思,但我希望这有帮助:

if (pizza.Intersect(allIngred).Count() == pizza.Count()){
     Console.WriteLine("All pizza ingredients exist");
}

听起来你想使用一些 Linq 的集合运算符。 这些将使您开始正确的方向。

特别是,请查看 Linq 的 Intersect 运算符。 如果相交的结果等于您关心的披萨的成分,那么您就知道您拥有所需的所有成分。

bool result = pizza.Intersect(allIngred).SequenceEqual(pizza);

Intersect()为您提供在两个数组之间共享的所有成员,SequenceEqual()标识结果集是否与提供的参数相同(在本例中,您希望查看所有披萨成分是否都在 allIngred 中(。

请注意,如果反转数组,这不一定有效:

bool result = allIngred.Intersect(pizza)…

因为Intersect的结果集将根据第一个参数进行排序,并且您需要结果与pizza匹配。

显式添加排序对于处理IEnumerable<T>会更安全,其中不能保证排序:

bool result = pizza.Intersect(allIngred).OrderBy(x => x).SequenceEqual(pizza.OrderBy(x => x));

对于此特定要求,可以通过在调用 Intersect() 后根据 pizza 数组的长度检查项目的Count()来进行优化。

虽然有几种使用 LINQ 的可能方法,但其中一些方法比其他方法更昂贵。 对于通常比交叉路口和"所有"方法运行得更快的内容,请尝试以下操作:

bool result = !pizza.Except(allIngred).Any();

当您想要执行更多此类操作时,将这两个数组转换为HashSet<string>将是一种更好的方法。

ISet<string> allIngred = new HashSet<string>() { ... items ...};
ISet<string> pizza = new HashSet<string>() { ... items ... };
bool haveIngredients = pizza.IsSubset(allIngred);