from item in range where item % 2 ==0 select i ;
扩展方法等同于它。
range.where(item % 2 ==0).select(x=>x)
。
我觉得linq的第一种方式是通过编译器翻译下一个,如果是,那么编译器是否有任何优化,例如range.where(item & 2 == 0)
而不是其他编译器?
答案 0 :(得分:2)
在LINQ查询结束时,C#编译器不会删除.Select
调用。原因是C#编译器不知道.Select
方法的作用,因此无法将其作为优化删除。
编译器无法掌握这些知识,因为它以非常灵活的方式绑定到Select
。它将考虑具有适当签名的目标类型上名为Select
的任何实例或扩展方法。您甚至可以定义自己的Select
方法来执行日志记录等自定义操作。如果C#编译器在这种情况下删除了Select
子句,它将破坏这种类型的代码。