当我想对列表执行某些操作时,我首先检查它是否不是null
或者不包含任何元素(不是为了foreach
)而我通常使用list.Any()
但是是最好的选择 - 使用list.Count > 0
,还是使用list.Any()
?
答案 0 :(得分:75)
Count
,请使用List
,因为它知道其大小。Length
代替Array
IEnumerable
,我会.Any()
使用.Count()
,因为它会更快,因为它会在检查一个项目后停止。另请查看此问题:Which method performs better: .Any() vs .Count() > 0?
答案 1 :(得分:4)
我使用list.Count > 0
只是因为它不依赖于LINQ方法,所以适用于C#2.0。
我个人避免像瘟疫那样的LINQ(因为它的速度很慢),而且无论如何都没有理由在这里使用扩展方法。
但是,更好的解决方案可能是制作{em>自己的版本的Any
,其中包含null
引用,并返回如果它是带元素的集合,则为true。这样可以省去空检查。
答案 2 :(得分:4)
.Any()
通常比.Count() > 0
更好用。这样做的原因是,如果您迭代的项目不是ICollection
,那么它将必须迭代整个列表以获得计数。
但是如果这些项目是ICollection
(List<T>
是),那么使用Count()
(Any()
迭代一次的速度快或在某些情况下更快无论MS .Net中的基础类型如何,但当基础项为Count > 0
时,Mono会尝试将其优化为ICollection
一个很棒的工具是Reflector,.Net源代码和Mono source code,可以让你看到事情是如何实现的。
答案 3 :(得分:2)
如果您正在使用实体框架并拥有一个包含许多记录的大表,则Any()会更快。我记得有一次我想检查表是否为空并且它有数百万行。 Count()&gt;花了20-30秒。 0完成。使用Any()即时。
答案 4 :(得分:0)
Any()可以提高性能,因为它可能不必迭代集合以获取事物的数量。它只需要打其中之一。或者,例如对于LINQ-to-Entities,生成的SQL将是IF EXISTS(...)而不是SELECT COUNT ...甚至SELECT * ....