可能重复:
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之间有什么区别?
答案 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)