Count()(linq扩展)和List<;T>;.计数

本文关键字:计数 lt gt List linq 扩展 Count | 更新日期: 2023-09-27 17:59:59

List<string> list = new List<string>() {"a", "b", "c"};
IEnumerable<string> enumerable = list;
int c1 = list.Count;
int c2 = list.Count();
int c3 = enumerable.Count();

最后三个语句在性能和实现方面是否存在差异?list.Count()的性能会比list.Count差还是相同?如果引用的类型是IEnumerable<string>,这有关系吗?

Count()(linq扩展)和List<;T>;.计数

让我们看看反射器:

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;
    }
    ICollection is3 = source as ICollection;
    if (is3 != null)
    {
        return is3.Count;
    }
    int num = 0;
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            num++;
        }
    }
    return num;
}

因此,如果您的IEnumerable<T>实现ICollection<T>ICollection,它将返回Count属性。

如果Linq Count方法实现了ICollection接口,并且因此已经具有Count属性,那么它非常聪明,不会迭代底层集合。

计数在IEnumerable上的实现首先检查可枚举列表是否也实现了ICollection<T>,其中T是可枚举列表的泛型参数。

如果是,则返回ICollection<T>.Count

如果不是,则检查是否实现了ICollection。如果是,则返回ICollection.Count

如果它既不实现这两个,就必须遍历整个列表和计数,对于大列表来说,这可能是一个昂贵的操作。

CCD_ 13实现CCD_ 14,因此性能将是相同的。

我假设它是这样工作的:List在变量中保留自己的计数。Count((在IEnumerable中循环以计算元素的数量。这将使List.Count更有效率。