Linq Enumerable.Count()与属性计数

Linq Enumerable.Count()与属性计数,linq,count,ienumerable,enumerable,Linq,Count,Ienumerable,Enumerable,实现System.Collection.ICollection的类知道其序列中有多少元素。它们具有返回序列号的属性计数。例如列表、字典和队列 实现IEnumerable的其他类可能不实现ICollection。你没有财产计数。但是,通过对所有元素进行枚举和计数,仍然可以知道序列中元素的数量 对我来说,后一种方法似乎慢得多 方法Enumerable.Count(这个IEnumerable)唯一知道序列的是它实现了IEnumerable。它不知道序列有一个属性,该属性提供了元素的数量 通常这意味着,

实现System.Collection.ICollection的类知道其序列中有多少元素。它们具有返回序列号的属性计数。例如列表、字典和队列

实现IEnumerable的其他类可能不实现ICollection。你没有财产计数。但是,通过对所有元素进行枚举和计数,仍然可以知道序列中元素的数量

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

方法Enumerable.Count(这个IEnumerable)唯一知道序列的是它实现了IEnumerable。它不知道序列有一个属性,该属性提供了元素的数量

通常这意味着,如果对列表进行计数(),函数必须遍历所有元素

但是,Enumerable.Count(IEnumerable)的实现可以检查序列是否实现了接口ICollection,如果实现了接口ICollection,则可以返回Count而不是对其进行枚举

问题:Count(这个IEnumerable)是否足够聪明,可以检查序列是否实现ICollection,或者它是否总是迭代所有元素?


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

查看源代码如何

在第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 collectionft=源作为ICollection;
如果(collectionoft!=null)返回collectionoft.Count;
ICollection collection=源作为ICollection;
if(collection!=null)返回collection.Count;
如您所见,当
IEnumerable
ICollection
时,该方法使用
ICollection.Count
属性

考虑到,带有签名
Count(此IEnumerable源代码,Func谓词)
的未实现此功能(因为您提供了自定义计数方法;)

编辑

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


由于所有这些原因,没有必要实现您自己的
Count()

我会使用。@TimSchmelter噢,谢谢您。。。我甚至不知道这个网站;有没有其他不使用github的理由?据我所知没有。但我喜欢MS站点,您可以轻松搜索方法或类,并查看引用方法的位置(单击方法名称)。我也喜欢第一手资料。当你点击F12时,还有一个可以直接带你到方法的参考资料来源。别谢我,谢谢@SLaks谁写的