Enumerable.Count() 对比 属性 计数

Enumerable.Count() vs property Count

类 实现 System.Collection.ICollection,知道它们的序列中有多少个元素。他们有一个 属性 计数,其中 return 是序列的数量。例如列表、字典和队列。

实现 IEnumerable 的其他 类 可能不实现 ICollection。你没有 属性 计数。但是,您仍然可以通过枚举所有元素并对它们进行计数来了解序列中元素的数量。

对我来说后一种方法似乎慢得多。

方法 Enumerable.Count(this IEnumerable) 对序列的唯一了解是它实现了 IEnumerable。它不知道序列有一个 属性 给你元素的数量。

通常这意味着如果您 Count() 一个列表,该函数必须遍历所有元素。

但是,Enumerable.Count(IEnumerable) 的实现可以检查序列是否实现接口 ICollection,如果是,它可以 return 计数而不是枚举它。

问题:Enumerable.Count(这个 IEnumerable) 是否足够智能来检查序列是否实现了 ICollection,或者它是否总是遍历所有元素?

如果是后者,用 Count 函数扩展 Enumerable 是否明智,该函数检查对象是否实现 ICollection,如果是 return ICollection.Count()?

查看源代码如何 code

在第 1905 行,您可以看到包含以下行的计数方法:

ICollection<TSource> collectionoft = source as ICollection<TSource>;
if (collectionoft != null) return collectionoft.Count;
ICollection collection = source as ICollection;
if (collection != null) return collection.Count;

如您所见,当 IEnumerableICollection.

时,该方法使用 ICollection.Count 属性

请注意,带有签名 Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)following method 未实现此功能(因为您提供了自定义计数方法;))

编辑:

还应该提到的是,LongCount 方法不使用 this property

因为这一切,没有必要实施你自己的 Count()