在IEnumerable上调用Count迭代整个集合吗?

时间:2015-09-30 10:25:41

标签: c# performance count ienumerable

请考虑以下代码:

static IEnumerable<int> GetItems()
{
    return Enumerable.Range(1, 10000000).ToArray();  // or: .ToList();
}

static void Main()
{
    int count = GetItems().Count();
}

它会迭代所有100亿个整​​数并逐个计算,还是会使用数组的Length / list Count属性?< / p>

2 个答案:

答案 0 :(得分:4)

如果IEnumerableICollection,则会返回Count属性。

这里是source code

public static int Count<TSource>(this IEnumerable<TSource> source)
{
    if (source == null) throw Error.ArgumentNull("source");
    ICollection<TSource> collectionoft = source as ICollection<TSource>;
    if (collectionoft != null) return collectionoft.Count;
    ICollection collection = source as ICollection;
    if (collection != null) return collection.Count;
    int count = 0;
    using (IEnumerator<TSource> e = source.GetEnumerator())
    {
        checked
        {
            while (e.MoveNext()) count++;
        }
    }
    return count;
}

数组实现ICollection<T>,因此不需要枚举。

答案 1 :(得分:0)

代码首先将所有整数放入数组中(由于你的.ToArray()调用),然后返回数组的长度(自all arrays implement ICollection),这是实际代码调用的。它不会逐个计算数组中的所有项目。