Array.Length和Array.Count()之间的差异

时间:2012-12-03 14:41:18

标签: c# arrays

  

可能重复:
  count vs length vs size in a collection
  Array.Length vs Array.Count

我宣布了这个数组:

int[] misInts = new Int[someNumber];

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

所以我可以得到SomeNumber的值: misInts.Length或misInts.Count()

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之间有什么区别?

2 个答案:

答案 0 :(得分:24)

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

由于此方法采用IEnumerable<T>(而不是具有ICollection<T>属性的Count),因此需要遍历整个序列以确定其大小。

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

答案 1 :(得分:9)

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