列表:计数与计数()

时间:2010-11-04 15:20:33

标签: c# .net list linq count

给定一个列表,首选哪个方法来确定里面的元素数量?

var myList = new List<string>();

myList.Count
myList.Count()

4 个答案:

答案 0 :(得分:111)

Count()是LINQ引入的扩展方法,而Count属性是List本身的一部分(源自ICollection)。但在内部,LINQ会检查您的IEnumerable是否实现ICollection,如果是,则使用Count属性。因此,在一天结束时,您使用哪一个List没有区别。

为了进一步证明我的观点,这里是Reflector对Enumerable.Count()

的代码
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;
}

答案 1 :(得分:23)

对于扩展方法Count上的类型,始终更喜欢LengthCount()属性。前者是包含它们的每种类型的O(1)。 Count()扩展方法有一些类型检查优化,可以使它在O(1)时间内运行,但如果底层集合不是它知道的少数几种类型之一,它将降级为O(N)。 / p>

答案 2 :(得分:9)

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

myList.Count()正在调用一个扩展方法(由LINQ引入),它循环遍历IEnumerabl中的所有项目,所以应该慢得多。

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

在大多数应用程序中,你很可能无法区分速度差异。

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

答案 3 :(得分:7)

如果您有任何机会想要更改收藏类型,最好使用Count()扩展程序。这样您就不必重构代码(例如使用Length)。