Enumerable.Count() 与属性 Count [重复]
Posted
技术标签:
【中文标题】Enumerable.Count() 与属性 Count [重复]【英文标题】:Enumerable.Count() vs property Count [duplicate] 【发布时间】:2016-01-12 04:06:33 【问题描述】:实现 System.Collection.ICollection 的类知道它们的序列中有多少元素。它们有一个属性 Count,它返回序列的数量。例如列表、字典和队列。
实现 IEnumerable 的其他类可能不会实现 ICollection。你没有财产数。但是,您仍然可以通过枚举所有元素并计算它们来知道序列中的元素数量。
对我来说,后一种方法似乎要慢得多。
Enumerable.Count(this IEnumerable) 方法唯一知道该序列的是它实现了 IEnumerable。它不知道该序列有一个属性可以为您提供元素数量。
通常这意味着如果您 Count() 一个 List,该函数必须遍历所有元素。
但是,Enumerable.Count(IEnumerable) 的实现可以检查序列是否实现了接口 ICollection,如果是,它可以返回 Count 而不是对其进行枚举。
问题:Enumerable.Count(this IEnumerable) 是否足够聪明,可以检查序列是否实现了 ICollection,或者它是否总是遍历所有元素?
如果是后者,使用 Count 函数扩展 Enumerable 是否明智,该函数检查对象是否实现 ICollection,如果是则返回 ICollection.Count()?
【问题讨论】:
【参考方案1】:看看源代码code怎么样。
在第 1905 行,你可以看到 count 方法有以下几行:
ICollection<TSource> collectionoft = source as ICollection<TSource>;
if (collectionoft != null) return collectionoft.Count;
ICollection collection = source as ICollection;
if (collection != null) return collection.Count;
如您所见,当IEnumerable
是ICollection
时,该方法使用ICollection.Count
属性。
考虑到,带有签名Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
的following method 没有实现这一点(因为您提供了自定义计数方法;))
编辑:
还应该提到,LongCount
方法不使用this property。
由于这一切,没有必要实现自己的Count()
。
【讨论】:
我会使用MS Reference Source。 @TimSchmelter 哦,谢谢...我什至不知道这个网站; D. 不使用 github 是否还有其他理由? 我不知道。但我喜欢 MS 站点,您可以轻松搜索方法或类,并查看引用方法的位置(单击方法名称)。我也更喜欢第一手资料。 还有一个VS Extension,当你按F12时,它会直接带你到一个方法的引用源。 不用感谢我,感谢写这篇文章的@SLaks以上是关于Enumerable.Count() 与属性 Count [重复]的主要内容,如果未能解决你的问题,请参考以下文章