列出<t>任何或计数?</t>

时间:2011-04-21 08:39:40

标签: c# linq c#-4.0

当我想对列表执行某些操作时,我首先检查它是否不是null或者不包含任何元素(不是为了foreach)而我通常使用list.Any()但是是最好的选择 - 使用list.Count > 0,还是使用list.Any()

5 个答案:

答案 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,那么它将必须迭代整个列表以获得计数。

但是如果这些项目是ICollectionList<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 * ....