哪种方法更好:.Any()与.Count() > 0?
哪种方法更好:.Any()与.Count() > 0?
在System.Linq
命名空间中,我们现在可以扩展我们的IEnumerable,以拥有Any()和Count()扩展方法。
最近有人告诉我,如果想要检查一个集合中是否包含1个或更多的项,应该使用.Any()
扩展方法,而不是.Count() > 0
扩展方法,因为.Count()
扩展方法必须迭代所有项。
其次,有些集合有一个属性(不是扩展方法),即Count
或Length
。使用这些属性,而不是.Any()
或.Count()
,是否更好?
是/否?
admin 更改状态以发布 2023年5月21日
如果你的数据源拥有.Length
或.Count
属性(如ICollection
、IList
、List
等),那么使用这些属性将是最快的选择,因为它不需要像Any()
那样去执行GetEnumerator()
/MoveNext()
/Dispose()
方法来检查是否存在非空的IEnumerable
序列。
对于只有IEnumerable
的情况,Any()
通常更快,因为它只需要查看一个枚举。但是,需要注意的是,Count()
的LINQ-to-Objects实现确实检查了ICollection
(使用.Count
作为优化),因此如果底层数据源是一个直接的列表/集合,那么不会有太大的差异。不要问我为什么它不使用非泛型的ICollection
……
当然,如果你使用LINQ对其进行过滤等操作(如Where
等),则会得到一个基于迭代块的序列,因此这个ICollection
优化是无用的。
通常情况下,对于IEnumerable
:请使用Any()
;-p