2010-09-10 176 views
0

既然LINQ是.NET的重要组成部分,那么他们在编译器级别上的优化是否会使用最佳路径来获取结果呢?LINQ在编译器级别执行什么类型的优化?

例如,假设您有一个整数数组并且想要获得最低值。你可以在不使用LINQ的情况下使用foreach来做到这一点,但是在LINQ中使用Min函数肯定更容易。一旦使用LINQ编译这个代码,你最好完全跳过LINQ,还是把它转换成类似于foreach的东西?

+0

乔恩斯威特在他的博客上写了一篇关于那个(有点)的文章:http://msmvps.com/blogs/jon_skeet/archive/2010/02/10/optimisations-in-linq-to-objects.aspx – 2010-09-10 06:59:17

回答

2

C#编译器根本就没有做太多工作 - 它只是调用你告诉它的方法。

你可以说,去除不必要的选择调用是一个优化:

from x in collection 
where x.Condition 
select x 

因为编译器可识别的身份转变为多余的被编译为collection.Where(x => x.Condition),而不是collection.Where(x => x.Condition).Select(x => x)。 (形式from x in collection select x的简并查询不受此优化,但是,允许LINQ提供程序,以确保任何查询经过至少一个他们的方法。)

的LINQ到对象Min方法只是做一个foreach,是的。各种LINQ to Objects方法do执行优化。例如,Count()将检查数据源是否实现ICollectionICollection<T>,如果是,则使用Count属性。正如madgnome在评论中指出的,前一段我在blog post中写了更多关于这方面的内容。

当然,其他LINQ提供者可以执行自己的优化。