使用LinQ代码检索bool结果

时间:2012-01-20 20:23:44

标签: c# linq

如果披萨的成分存在于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" };

6 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

Intersect()为您提供两个数组之间共享的所有成员,SequenceEqual()标识结果集是否与提供的参数相同(在这种情况下,您希望查看是否所有披萨配料全部都是。)

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

bool result = allIngred.Intersect(pizza)…

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

明确添加排序会更安全地处理IEnumerable<T>,但不保证订购:

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

对于此特定要求,您可以在调用Count()之后检查项Intersect()pizza数组的长度相比进行优化。

答案 3 :(得分:1)

听起来你想要使用一些Linq的set operators。这些将帮助您开始正确的方向。

特别要查看Linq的Intersect运营商。如果交叉的结果等于你所关心的披萨的成分,那么你知道你拥有所需的所有成分。

答案 4 :(得分:1)

虽然有几种可能的方法使用LINQ,但其中一些方法比其他方法更昂贵。对于通常比交叉运行速度快的东西而言,所有&#34;方法,尝试以下方法:

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

答案 5 :(得分:0)

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

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

bool haveIngredients = pizza.IsSubset(allIngred);