Linq,lambda - 哪个声明更快?

时间:2011-01-10 13:23:49

标签: linq performance lambda

我想知道哪个表达式更快,哪个表示首选:

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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

没有人知道,你必须衡量。考虑一个包含50个项目的列表,其中40个项目符合过滤条件。

Project然后过滤,这种方法最小化了对a.Property的访问次数。 100个匿名方法调用和50个属性访问。

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

过滤然后项目,这种方法可以最大限度地减少对匿名方法的调用次数。 90个匿名方法调用和90个属性访问。

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

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

答案 2 :(得分:0)

这取决于Linq提供商。

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

在Linq2Objects中,它可能表现不同。

答案 3 :(得分:0)

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

请注意,首先过滤不一定是更快;通过首先调用Select,您将执行更少的属性访问器 - 但不同的方式可能是次要的。

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