编译器是否将LINQ连接到哪里查询?

Ste*_*ris 5 .net c# linq compilation

考虑以下两个类似的代码示例.

一个where条款.

bool validFactory
  = fields
    .Where(
      fields => field.FieldType == typeof( DependencyPropertyFactory<T> ) &&
                field.IsStatic )
    .Any();
Run Code Online (Sandbox Code Playgroud)

两个where条款.

bool validFactory
  = fields
    .Where( field => field.FieldType == typeof( DependencyPropertyFactory<T> ) )
    .Where( field => field.IsStatic )
    .Any();
Run Code Online (Sandbox Code Playgroud)

我更喜欢第二种,因为我发现它更具可读性,并且它导致更少的格式化问题,尤其是在使用自动格式化时.在单独条件(或甚至上方)旁边放置注释以澄清意图时也更清楚.

我的直觉说第二个代码样本的效率会降低.我当然可以自己写一个简单的测试(并且如果没人知道答案的话).现在我认为这是SO的完美食物.,p

  1. 一个比另一个更有效吗?
  2. 编译器是否足够智能来优化它?

Eri*_*ert 12

编译器不会尝试优化连续的"地方"的电话.运行时库可以.如果你有一大堆"where"和"select"调用彼此相邻,运行时将尝试将它们重新组织成更有效的形式.

在一些不寻常的情况下,当然"优化"会使事情变得更糟.我似乎记得Jon Skeet最近写了一篇关于这篇文章的文章,尽管我不知道它在哪里.

  • 埃里克,我想你指的是这篇博文.http://msmvps.com/blogs/jon_skeet/archive/2011/06/16/linq-to-objects-and-the-performance-of-nested-quot-where-quot-calls.aspx (4认同)