C#Linq问题

时间:2011-03-31 00:37:48

标签: c# linq performance optimization

如果我有以下声明:

whatever.Select(x => collection.ToArray()[index]).ToList();

那么,LINQ是否足够聪明,只能执行一次ToArray演员(我真的不知道如何转换和评估这个闭包)? < / p>

我理解这段代码很糟糕,只是感兴趣。

2 个答案:

答案 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,包括副作用)。