2011-01-10 60 views
0

我想知道其表达是更快和哪一个是优选的:Linq,lambda - 哪个语句更快?

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

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

当然为什么和?

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

+3

它们不一样,也没有编译。第二个应该是`a =>!string.IsNullOrEmpty(a.Property)` – Kobi 2011-01-10 13:26:07

+0

固定代码,它几乎肯定应该是。 – 2011-01-10 14:31:29

+0

@Eamon - 差不多,我拿出了一个额外的`a =>`。谢谢! – Kobi 2011-01-10 16:13:11

回答

1

没有人可以知道,你必须测量。考虑一个包含50个项目的清单,其中40个项目符合过滤标准。

然后项目过滤,这种方法最大限度地减少了访问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) 

因为我们不知道你的财产的执行VS匿名方法调用的成本费用,有没有办法来思考的性能差异。

1

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

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

0

它取决于Linq提供程序。

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

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

0

这并不重要。在上述情况下,“查询”的其余部分仅引用投影数据,不妨先投影并过滤。

请注意,情况并非如此,首先过滤一定会更快;通过首先调用Select,您将会执行更少的属性访问器 - 但两者的差别可能很小。

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