Enumerable.Count()vs属性Count

时间:2015-10-14 07:21:24

标签: linq count ienumerable enumerable

实现System.Collection.ICollection的类,知道它们序列中有多少元素。它们有一个属性Count,它返回序列号。例如List,Dictionary和Queue。

实现IEnumerable的其他类可能无法实现ICollection。你没有财产数量。但是,您仍然可以通过枚举所有元素并计算它们来了解序列中元素的数量。

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

方法 Enumerable.Count(此IEnumerable)唯一知道的是它实现了IEnumerable。它不知道序列具有为您提供元素数量的属性。

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

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

问题:Enumerable.Count(此IEnumerable)是否足够聪明,可以检查序列是否实现ICollection,还是总是迭代所有元素?

如果是后一种情况,使用Count函数扩展Enumerable是否明智,该函数检查对象是否实现ICollection,如果是,则返回ICollection.Count()?

1 个答案:

答案 0 :(得分:4)

如何查看来源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;

如您所见,当ICollection.CountIEnumerable时,该方法使用ICollection属性。

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

修改

还应该提到,LongCount方法不使用following method

由于这一切,您无需实施自己的Count()