首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表: Count vs Count()

列表: Count vs Count()
EN

Stack Overflow用户
提问于 2010-11-04 23:20:33
回答 4查看 168.6K关注 0票数 129

在给定一个列表的情况下,哪种方法更适合确定其中元素的数量?

代码语言:javascript
复制
var myList = new List<string>();

myList.Count
myList.Count()
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-04 23:22:26

Count()是LINQ引入的扩展方法,而Count属性是列表本身的一部分(从ICollection派生)。不过在内部,LINQ会检查你的IEnumerable是否实现了ICollection,如果实现了,它会使用Count属性。所以在一天结束的时候,使用哪一个作为List是没有区别的。

为了进一步证明我的观点,下面是来自Enumerable.Count()的Reflector的代码

代码语言:javascript
复制
public static int Count<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    ICollection<TSource> is2 = source as ICollection<TSource>;
    if (is2 != null)
    {
        return is2.Count;
    }
    int num = 0;
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            num++;
        }
    }
    return num;
}
票数 142
EN

Stack Overflow用户

发布于 2010-11-04 23:27:29

始终优先使用类型的CountLength属性,而不是扩展方法Count()。前者对于包含它们的每一种类型都是O(1)。Count()扩展方法有一些类型检查优化,可以使它在O(1)时间内运行,但如果底层集合不是它所知道的为数不多的类型之一,它将降级为O(N)。

票数 34
EN

Stack Overflow用户

发布于 2010-11-04 23:22:09

myList.Count是list对象上的一个方法,它只返回一个字段的值,所以速度非常快。由于它是一个很小的方法,它很可能是由编译器(或运行时)内联的,因此它们可能会允许编译器进行其他优化。

myList.Count()调用了一个扩展方法(由LINQ引入),该方法循环遍历IEnumerable中的所有项,因此速度应该要慢得多。

但是(在Microsoft实现中) Count扩展方法有一个列表的“特殊情况”,允许它使用列表的Count属性,这意味着Count()方法只比Count属性慢一点。

在大多数应用程序中,您不太可能分辨出速度的不同。

因此,如果您知道您正在处理一个列表,请使用IEnumerabl属性,否则,如果您有一个“未知的”计数,请使用Count()方法并让它为您优化。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4098186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档