代码之家  ›  专栏  ›  技术社区  ›  Keith Adler

LINQ在编译器级别执行什么类型的优化?

  •  0
  • Keith Adler  · 技术社区  · 14 年前

    既然linq是.NET不可或缺的一部分,那么它们在编译器级别的优化是否会使用最佳路径来获得结果?

    例如,假设您有一个整数数组,想要得到最小的值。您可以在不使用foreach的情况下执行此操作,但在linq中使用min函数肯定更容易。一旦这进入到使用linq的编译器中,您会更好地完全跳过linq,或者它本质上只是将其转换为类似于foreach的东西?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Joe the Coder Jon Skeet    6 年前

    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 Min 方法 只是做一个前臂,是的。各种Linq to Objects方法 执行优化。例如, Count() 将检查数据源是否实现 ICollection ICollection<T> 并使用 Count 属性(如果是)。正如Magnome在评论中指出的,我在 blog post 不久前。

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