既然LINQ是.NET不可或缺的一部分,那么它们在编译器级别的优化会使用最佳路径来获得结果吗?
例如,假设您有一个整数数组,并希望获得最低值。您可以使用foreach在没有LINQ的情况下执行此操作,但在LINQ中使用Min函数肯定更容易。一旦使用LINQ进入编译器,你最好完全跳过LINQ,还是只是将它转换为类似foreach的东西?
答案 0 :(得分:2)
C#编译器根本没用 - 它只是调用你告诉它的方法,基本上。
您可能会认为删除不必要的Select调用是一种优化:
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 to Objects Min
方法只是做了一个foreach,是的。各种LINQ to Objects方法执行执行优化。例如,Count()
将检查数据源是否实现ICollection
或ICollection<T>
,如果是,则使用Count
属性。正如madgnome在评论中指出的那样,我在blog post前写了一些关于此的内容。
当然,其他LINQ提供程序可以执行自己的优化。