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;

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

考虑到,带有签名Count&lt;TSource&gt;(this IEnumerable&lt;TSource&gt; source, Func&lt;TSource, bool&gt; predicate) 的following method 没有实现这一点(因为您提供了自定义计数方法;))

编辑

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

由于这一切,没有必要实现自己的Count()

【讨论】:

我会使用MS Reference Source。 @TimSchmelter 哦,谢谢...我什至不知道这个网站; D. 不使用 github 是否还有其他理由? 我不知道。但我喜欢 MS 站点,您可以轻松搜索方法或类,并查看引用方法的位置(单击方法名称)。我也更喜欢第一手资料。 还有一个VS Extension,当你按F12时,它会直接带你到一个方法的引用源。 不用感谢我,感谢写这篇文章的@SLaks

以上是关于Enumerable.Count() 与属性 Count [重复]的主要内容,如果未能解决你的问题,请参考以下文章

两个字符串数组的快速 count() 交集

数组有多少元素不为空?

border:0与border:none区别与联系

C#属性访问器

如何将django-haystack搜索方面与自定义属性一起使用?

php反序列化