【问题标题】: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 转换(我不太清楚这个闭包是如何转换和评估的)?

我知道这段代码不好,只是感兴趣。

【问题讨论】:

  • 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中的每个项目都会执行一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-26
      • 2012-11-29
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      相关资源
      最近更新 更多