给定内存中的对象列表,我运行以下两个表达式:
myList.where(x => x.Name == "bla").Any()
对比
myList.Any(x => x.Name == "bla")
后者总是最快的,我相信这是由于 Where 枚举了所有项目。但是,当没有匹配项时也会发生这种情况。
我不确定确切的原因。在任何情况下,这种观察到的性能差异不会出现,例如查询 Nhib?
干杯。
给定内存中的对象列表,我运行以下两个表达式:
myList.where(x => x.Name == "bla").Any()
对比
myList.Any(x => x.Name == "bla")
后者总是最快的,我相信这是由于 Where 枚举了所有项目。但是,当没有匹配项时也会发生这种情况。
我不确定确切的原因。在任何情况下,这种观察到的性能差异不会出现,例如查询 Nhib?
干杯。
Any()
with 谓词可以在没有迭代器 ( yield return
)的情况下执行其任务。使用 aWhere()
创建一个迭代器,它增加了对性能的影响(尽管非常小)。
因此,在性能方面(稍微),您最好使用带有Any()
谓词 ( x => x.Name == "bla"
) 的形式。就个人而言,我发现它更具可读性......
附带说明,Where()
不一定枚举所有元素,它只是创建一个迭代器,该迭代器将在请求元素时遍历元素,因此在Any()
之后的调用Where()
将驱动迭代,它将在它发现的第一个项目处停止符合条件。
因此,性能差异不是Where()
迭代所有项目(在 linq-to-objects 中),因为它确实不需要(当然,除非它没有找到满足它的项目),而是该Where()
子句具有设置一个迭代器来遍历元素,而Any()
使用谓词则不会。
假设您正确where
toWhere
和=
to ==
,我希望“Any
带谓词”版本的执行速度会稍微快一些。但是,我希望差异显着的情况很少而且相差甚远,因此您应该首先以可读性为目标。
碰巧的是,就可读性而言,我通常也更喜欢“Any
带有谓词”的版本,因此您在两个方面都取得了胜利-但您确实应该首先使用您发现更具可读性的内容。在你真正关心的场景中测量性能,如果一段代码没有按照你的需要执行,那么考虑对其进行微优化——当然是在每一步进行测量。
我相信这是由于 Where 枚举了所有项目。
如果myList
是内存中的集合,则不是。该Where
方法使用延迟执行,因此它只会枚举所需数量的项目以确定结果。在这种情况下,您不会看到.Any(...)
和之间有任何显着差异.Where(...).Any()
。
在任何情况下,这种观察到的性能差异不会出现,例如查询 Nhib?
是的,如果myList
是一个数据源,它将采用方法生成的表达式并转换为查询以在其他地方运行(例如 LINQ To SQL),您可能会看到差异。翻译表达式的代码在翻译其中一个表达式时做得更好。