如果披萨的成分存在于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" };
答案 0 :(得分:3)
您可以结合使用All
和Contains
方法检查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);