计数属性与Count()方法?

使用集合我有两种方法来获取对象的数量; Count(属性)和Count()方法。 任何人都知道什么是关键区别? 我可能是错的,但是我总是在任何条件语句中使用Count属性,因为我假设Count()方法对集合执行某种查询,而Count必须在我得到之前就已经被分配了。 但这是一个猜测 – 我不知道如果我错了,性能是否会受到影响。

编辑:出于好奇然后,如果集合为空将Count()抛出exception? 因为我很确定Count属性只是返回0。

反编译Count()扩展方法的源代码显示它testing对象是ICollection (generics还是其他),如果是这样,只是返回基本的Count属性:

所以,如果你的代码访问Count而不是调用Count() ,你可以绕过types检查 – 理论性能上的好处,但我怀疑这将是一个明显的!

 // System.Linq.Enumerable public static int Count<TSource>(this IEnumerable<TSource> source) { checked { if (source == null) { throw Error.ArgumentNull("source"); } ICollection<TSource> collection = source as ICollection<TSource>; if (collection != null) { return collection.Count; } ICollection collection2 = source as ICollection; if (collection2 != null) { return collection2.Count; } int num = 0; using (IEnumerator<TSource> enumerator = source.GetEnumerator()) { while (enumerator.MoveNext()) { num++; } } return num; } } 

性能只是select其中一个的原因之一。 select.Count()意味着你的代码会更通用。 我曾经有过重构一些不再生成集合的代码,而是像IEnumerable这样更通用的代码,但是其他代码因为依赖于.Count而被.Count ,我必须将其更改为.Count() 。 如果我在每个地方都使用.Count() ,代码可能会更易于重用和维护。 通常select使用更通用的接口,如果你能摆脱它是最好的select。 更通用的意思是更简单的接口,通过更多的types来实现,从而使你的代码之间更好的兼容。

我不是说.Count()更好,我只是说,还有其他的考虑,更多地处理你正在编写的代码的可重用性。

.Count()方法可能足够聪明,或者知道所讨论的types,如果是这样的话,它可能会使用底层的.Count属性。

然后再一次,它可能不会。

我认为可以肯定的是,如果集合本身拥有.Count属性,那么在性能方面这将是最好的select。

如果.Count()方法不知道集合,它将枚举它,这将是一个O(n)操作。

Count()方法是一个扩展方法,它迭代IEnumerable <>的每个元素并返回有多less个元素。 如果IEnumerable的实例实际上是一个List <>,那么它被优化为返回Count属性而不是迭代所有元素。

如果存在Count或Length属性,则应始终优先考虑Count()方法,该方法通常迭代整个集合以计算其中的元素数。 (例外情况是,当Count()方法是针对Linq to SQL或Linq to Entities源的,例如,在这种情况下,它会对数据源执行一个计数查询。即使如此,如果有一个Count属性,想要这样做,因为它可能没有什么工作要做。)

Count()方法是适用于任何IEnumerable <>的LINQ方法。 你会期望Count()方法遍历整个集合来查找计数,但我相信LINQ代码实际上有一些优化在那里检测是否存在Count属性,如果是这样使用。

所以他们都应该做几乎相同的事情。 Count属性可能稍微好一些,因为不需要在那里进行types检查。

简版:如果你有一个Count属性和一个Count()方法之间的select,总是select属性。

差别主要在于操作的效率。 所有公开Count属性的BCL集合都是以O(1)方式进行的。 Count()方法虽然可以并且通常会花费O(N)。 有一些检查尝试并得到O(1)的一些实现,但它并不是保证。

Count()作为LINQ的扩展方法 – CountList s上的一个属性,实际的.NET集合对象。

因此, Count()几乎总是比较慢,因为它会枚举集合/可查询对象。 在列表,队列,堆栈等,使用Count 。 或者为一个数组 – Length