5

可能重复:
LINQ 扩展方法 - Any() vs. Where() vs. Exists()

给定内存中的对象列表,我运行以下两个表达式:

myList.where(x => x.Name == "bla").Any() 

对比

myList.Any(x => x.Name == "bla")

后者总是最快的,我相信这是由于 Where 枚举了所有项目。但是,当没有匹配项时也会发生这种情况。

我不确定确切的原因。在任何情况下,这种观察到的性能差异不会出现,例如查询 Nhib?

干杯。

4

3 回答 3

10

Any()with 谓词可以在没有迭代器 ( yield return)的情况下执行其任务。使用 aWhere()创建一个迭代器,它增加了对性能的影响(尽管非常小)。

因此,在性能方面(稍微),您最好使用带有Any()谓词 ( x => x.Name == "bla") 的形式。就个人而言,我发现它更具可读性......

附带说明,Where()不一定枚举所有元素,它只是创建一个迭代器,该迭代器将在请求元素时遍历元素,因此在Any()之后的调用Where()将驱动迭代,它将在它发现的第一个项目处停止符合条件。

因此,性能差异不是Where()迭代所有项目(在 linq-to-objects 中),因为它确实不需要(当然,除非它没有找到满足它的项目),而是该Where()子句具有设置一个迭代器来遍历元素,而Any()使用谓词则不会。

于 2012-05-29T13:54:19.440 回答
2

假设您正确wheretoWhere=to ==,我希望“Any带谓词”版本的执行速度会稍微快一些。但是,我希望差异显着的情况很少而且相差甚远,因此您应该首先以可读性为目标。

碰巧的是,就可读性而言,我通常也更喜欢“Any带有谓词”的版本,因此您在两个方面都取得了胜利-但您确实应该首先使用您发现更具可读性的内容。在你真正关心的场景中测量性能,如果一段代码没有按照你的需要执行,那么考虑对其进行微优化——当然是在每一步进行测量。

于 2012-05-29T13:57:11.630 回答
0

我相信这是由于 Where 枚举了所有项目。

如果myList是内存中的集合,则不是。该Where方法使用延迟执行,因此它只会枚举所需数量的项目以确定结果。在这种情况下,您不会看到.Any(...)和之间有任何显着差异.Where(...).Any()

在任何情况下,这种观察到的性能差异不会出现,例如查询 Nhib?

是的,如果myList是一个数据源,它将采用方法生成的表达式并转换为查询以在其他地方运行(例如 LINQ To SQL),您可能会看到差异。翻译表达式的代码在翻译其中一个表达式时做得更好。

于 2012-05-29T13:59:58.317 回答