可能重复:
LINQ extension methods - Any() vs. Where() vs. Exists()
给定内存中的对象列表,我运行了以下两个表达式:
myList.where(x => x.Name == "bla").Any()
vs
myList.Any(x => x.Name == "bla")
后者总是最快的,我相信这是由于枚举所有项目的地方。但是当没有匹配时也会发生这种情况。
我不确定为什么会这样。是否存在这种观察到的性能差异的情况,例如它是否在查询Nhib?
干杯。
答案 0 :(得分:8)
带谓词的Any()
可以在没有迭代器(yield return
)的情况下执行其任务。使用Where()
创建一个迭代器,这会增加性能影响(虽然非常小)。
因此,在性能方面(稍微一点),您最好使用采用谓词(Any()
)的x => x.Name == "bla"
形式。我个人认为,这也更具可读性......
在旁注中,Where()
不一定要枚举所有元素,它只是创建一个迭代器,它将在请求时遍历元素,因此在{{Any()
之后调用Where()
1}}将驱动迭代,迭代将在找到的匹配条件的第一个项目处停止。
所以性能差异不 Where()
遍历所有项目(在linq-to-objects中),因为它确实不需要(当然,除非找不到满足它的那个),所以Where()
子句必须设置迭代器来遍历元素,而带有谓词的Any()
则不然。
答案 1 :(得分:2)
假设您将where
更改为Where
并=
更改为==
,我希望“Any
带有谓词”版本来执行非常快一点。但是,我认为差异显着的情况很少,所以你应该首先瞄准可读性。
实际上,我通常更喜欢“Any
带有谓词”版本的可读性,所以你在两个方面都获胜 - 但是你应该首先选择你认为更具可读性的版本。 测量您实际关注的场景中的性能,如果某段代码没有按照您的需要执行,那么会考虑对其进行微观优化 - 每次测量一步,当然。
答案 2 :(得分:0)
我认为这是由于枚举所有项目的位置。
如果myList
是内存中的集合,则不会。 Where
方法使用延迟执行,因此它只会枚举确定结果所需的项目数。在这种情况下,您不会在.Any(...)
和.Where(...).Any()
之间看到任何显着差异。
是否存在这种观察到的性能差异的情况 是这样,就像是在询问Nhib一样?
是的,如果myList
是一个数据源,它将采用方法生成的表达式并转换为在其他地方运行的查询(例如LINQ To SQL),您可能会看到不同之处。翻译表达式的代码在翻译其中一个表达式方面做得更好。