【问题标题】:Performance implications of calling ToArray inside a LINQ selector在 LINQ 选择器中调用 ToArray 的性能影响
【发布时间】:2011-07-26 12:46:34
【问题描述】:
如果我有以下陈述:
whatever.Select(x => collection.ToArray()[index]).ToList();
LINQ 是否足够聪明,可以只执行一次 ToArray 转换(我不太清楚这个闭包是如何转换和评估的)?
我知道这段代码不好,只是感兴趣。
【问题讨论】:
标签:
c#
performance
linq
optimization
collections
【解决方案1】:
您可以查看LINQBridge 的代码,尤其是Select 方法(最终调用SelectYield。
SelectYield的本质是一个简单的for循环:
foreach (var item in source)
yield return selector(item, i++);
selector 是您传入的 lambda 表达式,在您的情况下为 x => collection.ToArray()[index]。从这里很明显,整个 lambda 表达式将针对 whatever 中的每个元素进行评估。
请注意,LINQBridge 是 LINQ2Objects 的独立重新实现,因此不一定相同(但在很大程度上至少表现得与 LINQ2Objects 完全一样,包括副作用)。
【解决方案2】:
不,对于whatever中的每个项目都会执行一次。