【问题标题】:Linq, lambda - which statement is faster?Linq,lambda - 哪个语句更快?
【发布时间】:2011-01-10 13:23:49
【问题描述】:

我想知道哪个表达式更快,哪个更受欢迎:

myList.Select(a => a.Property)
      .Where(a => !String.IsNullOrEmpty(a))

myList.Where(a => !String.IsNullOrEmpty(a.Property))
      .Select(a => a.Property)

当然是为什么?

通常我的问题是:我应该使用Where 后跟Select 还是Select 后跟Where

【问题讨论】:

  • 它们不一样,也不编译。第二个应该是a => !string.IsNullOrEmpty(a.Property)
  • 将代码修复为几乎可以肯定的样子。
  • @Eamon - 几乎,我拿出了一个额外的a =>。谢谢!

标签: linq performance lambda


【解决方案1】:

没有人可以知道,你必须测量。考虑一个包含 50 个项目的列表,其中 40 个项目满足过滤条件。

Project 然后进行过滤,这种方法最大限度地减少了对 a.Property 的访问次数。 100 次匿名方法调用和 50 次属性访问。

myList
   .Select(a => a.Property)
   .Where(a => !String.IsNullOrEmpty(a))

Filter then project,这种方法可以最大限度地减少匿名方法的调用次数。 90 个匿名方法调用和 90 个属性访问。

myList
   .Where(a => !String.IsNullOrEmpty(a.Property))
   .Select(a => a.Property) 

由于我们不知道您的属性的实现成本与匿名方法调用的成本,因此无法推断性能差异。

【讨论】:

    【解决方案2】:

    我更喜欢第二种,首先过滤数据(使用Where),然后选择(使用Select)你想要的数据。

    根据您过滤的数据,性能可能会有所不同,但我觉得第二个更流畅。

    【讨论】:

      【解决方案3】:

      这取决于 Linq 提供程序。

      例如在 Linq2Sql 中,两个语句是相同的,因为 thwy 将对数据库生成相同的 SQL。

      在 Linq2Objects 中,它可能会执行不同的操作。

      【讨论】:

      • 你好,出于某种原因,不敢相信两个人可以写出相同的答案(特别是如果他们似乎是正确的)。
      【解决方案4】:

      没关系。在上述情况下,“查询”的其余部分仅引用投影数据,您不妨先投影,然后过滤。

      请注意,首先过滤不一定会更快;通过首先调用Select,您将执行更少的属性访问器 - 但无论哪种方式,差异都可能很小。

      如果您要编写更复杂的查询,我建议尽可能快地减少数据范围,在这种情况下,这意味着在 Where 之前编写 Select:这会导致代码更短这在更长的查询中更具可读性:毕竟,通过只关注相关位(这里是字符串),读者可以忽略在其余查询中包含它们的更复杂的对象。然而,对于这么小的查询,这个优势是毫无意义的。

      【讨论】:

        猜你喜欢
        • 2012-03-21
        • 2017-08-29
        • 1970-01-01
        • 2011-01-09
        • 1970-01-01
        • 1970-01-01
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多