我想知道哪个表达式更快,哪个表示首选:
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
?
答案 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
:导致更短的代码在更长的查询中更具可读性:毕竟,通过仅关注相关位(此处为字符串),读者可以忽略在查询的其余部分中包含它们的更复杂的对象。然而,对于如此小的查询,这个优点毫无意义。