在System.Linq命名空间中,我们现在可以扩展我们的IEnumerable以拥有Any()和Count() 扩展方法 。
System.Linq
最近有人告诉我,如果我想检查一个集合中是否包含 1 个或多个项目,我应该使用.Any()扩展方法而不是.Count() > 0扩展方法,因为.Count()扩展方法必须遍历所有项目。
.Any()
.Count() > 0
.Count()
其次,一些集合有一个 属性 (不是扩展方法)是Countor Length。使用它们而不是.Any()or会更好.Count()吗?
Count
Length
是的/不?
如果您从具有.Lengthor的东西开始.Count(例如ICollection<T>, IList<T>,List<T>等) - 那么这将是最快的选择,因为它不需要通过检查非空序列所需的GetEnumerator()//序列.MoveNext()``Dispose()``Any()``IEnumerable<T>
.Length
.Count
ICollection<T>
IList<T>
List<T>
GetEnumerator()
MoveNext()``Dispose()``Any()``IEnumerable<T>
对于 just IEnumerable<T>, then 通常Any()会更快,因为它只需要查看一次迭代。但是,请注意,LINQ-to- Objects 的实现确实会检查(用作优化) - 因此,如果您的基础数据源 直接* 是列表/集合,则不会有很大的不同。不要问我为什么不使用非泛型… __Count()``ICollection<T>``.Count *ICollection
IEnumerable<T>
Any()
Count()``ICollection<T>``.Count
ICollection
当然,如果您使用 LINQ 对其进行过滤等(Where等等),您将拥有一个基于迭代器块的序列,因此这种ICollection<T>优化是无用的。
Where
通常使用IEnumerable<T>: 坚持使用Any();-p