19

可能重复:
集合中的计数、长度和大小
Array.Length vs Array.Count

我声明了这个数组:

int[] misInts = new Int[someNumber];

/* make some happy operations with the elements in misInts */

所以我可以通过 misInts.Length 或 misInts.Count() 获得 SomeNumber 的值

C# 中的数组继承自 IEnumerable。所以如果我有:

Func<int> misIntsF = Enumerable.Range(0, someNumber).Select(c=> /* make some happy operations that return Integers */);

有人告诉我,如果我创建 misIntsF.Count(),我实际上会执行 Lambda 表达式中的代码,获取结果并计算它们。但是数组 misInts 没有 Lambda 表达式。

misInts.Count() 是否比 misInts.Length 更消耗内存?misInts.Count() 和 misInts.Length 有什么区别?

4

2 回答 2

28

array.Count()实际上是对Enumerable.Count<T>(IEnumerable<T>)扩展方法的调用。

由于这个方法需要一个IEnumerable<T>(而不是ICollection<T>,它有一个Count属性),它需要遍历整个序列来确定它有多大。

但是,它实际上检查参数是否实现ICollection<T>(哪些数组实现),如果是,则Count直接返回。
因此,调用.Count()数组并不比调用慢多少.Length,尽管它会涉及额外的类型转换。

于 2012-12-03T14:43:30.927 回答
10

没有太大的区别,因为Enumerable.Count如果它可以转换为 ICollection<T>.

MSDN:

如果源的类型实现了 ICollection,则该实现用于获取元素的计数。否则,此方法确定计数。

来源:

ICollection<TSource> collection = source as ICollection<TSource>;
if (collection != null)
{
    return collection.Count;
}

否则它将枚举序列以对其进行计数:

int num = 0;
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        num++;
    }
}
return num;

(来源:ILSpy

于 2012-12-03T14:43:53.020 回答