实现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()?
答案 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.Count
为IEnumerable
时,该方法使用ICollection
属性。
请注意,带有签名Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
的{{3}}未实现此功能(因为您提供的自定义计数方法;)
修改强>:
还应该提到,LongCount
方法不使用following method。
由于这一切,您无需实施自己的Count()
。