2010-06-08 130 views
1

from item in range where item % 2 ==0 select i ;Linq查询转换为lambda表达式?

它的扩展方法是等价的。

range.where(item % 2 ==0).select(x=>x)

我觉得linq的第一种方法是通过编译器翻译下一个,如果是,那么是否有像这样的编译器的优化,而不是其他的?

+0

如果您手动编写,上述所有查询都返回相同的结果。但是编译器并不知道select方法中的内容。所以它不会达到这个水平。 – 2013-04-02 05:46:59

回答

2

否C#编译器不会在LINQ查询结束时删除.Select调用。原因在于C#编译器不知道.Select方法的功能,因此无法将其作为优化进行移除。

编译器不能拥有这方面的知识,因为它以非常灵活的方式绑定到Select。它会考虑具有适当签名的目标类型上名为Select的任何实例或扩展方法。您甚至可以定义自己的Select方法来执行自定义操作,如日志记录。如果C#编译器在这种情况下删除Select子句,它将打破这种类型的代码。

+0

我写的所有这些查询都有相同的结果? – Freshblood 2010-06-08 14:50:42

+0

@Floodblood,我不明白你的意思 – JaredPar 2010-06-08 14:57:26

+0

是的,这三个查询产生的结果是我问的。 – Freshblood 2010-06-08 18:07:41