如果披萨的成分存在于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" };
您可以使用 All
和 Contains
方法的组合来检查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);