如果我有以下声明:
whatever.Select(x => collection.ToArray()[index]).ToList();
那么,LINQ
是否足够聪明,只能执行一次ToArray
演员(我真的不知道如何转换和评估这个闭包)? < / p>
我理解这段代码很糟糕,只是感兴趣。
答案 0 :(得分:6)
不会, 中的每个项目都会执行一次。
答案 1 :(得分:1)
您可以查看LINQBridge的代码,尤其是Select
方法(最终调用SelectYield
。
SelectYield
的本质是一个简单的for循环:
foreach (var item in source)
yield return selector(item, i++);
其中selector
是您传入的lambda表达式,在您的情况x => collection.ToArray()[index]
中。从这里可以看出,将为whatever
中的每个元素评估整个lambda表达式。
请注意,LINQBridge是LINQ2Objects的独立重新实现,因此不一定相同(但在很大程度上至少表现得像LINQ2Object,包括副作用)。