C# Linq中Any与All等价写法性能对比及认知校验
LINQ中All与Any对应写法的性能问题解答
核心结论
你的判断不正确,这两种写法的运行逻辑完全等价,实际执行性能几乎没有差异,不存在Any稳定比All更快的情况。
具体原因说明
1. 你对All方法的运行逻辑存在误解
LINQ的All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)方法底层并不会无脑遍历整个集合:
- 遍历过程中只要遇到第一个不满足predicate条件的元素,就会立刻终止遍历,直接返回false
- 只有当所有元素都满足predicate条件时,才会遍历完整个集合返回true
2. 两种写法逻辑完全等价
你给出的两段代码判断的是完全相同的结果:
- 写法1
recordsList.All(r => r.Deleted):判断集合中所有元素的Deleted属性都是true - 写法2
!recordsList.Any(r => !r.Deleted):判断集合中不存在任何一个Deleted属性为false的元素
二者的判断逻辑互为逆否命题,最终输出的布尔值完全一致。
3. 遍历次数完全相同
不管集合数据是什么样的,两种写法的遍历次数没有任何区别:
- 只要集合中存在
Deleted = false的元素,二者都会在找到第一个符合该条件的元素时立刻终止遍历,遍历次数一致 - 如果集合中所有元素的
Deleted都是true,二者都会遍历完整个10万条记录的集合才返回结果,遍历次数一致
二者仅有的差异是谓词里多了一次逻辑取反操作,这个开销是纳秒级的,在10万条数据的场景下完全感知不到,属于正常运行误差范围。
额外补充
如果这两个写法是作用于IQueryable类型的远程数据源(比如Entity Framework查询数据库),二者生成的SQL语句完全一致,数据库端的执行性能也没有任何差别。
内容的提问来源于stack exchange,提问作者Secretary Of Education
相关产品推荐
相关产品推荐

