【问题标题】:Differences between Array.Length and Array.Count() [duplicate]Array.Length 和 Array.Count() 之间的差异 [重复]
【发布时间】:2012-11-21 01:17:47
【问题描述】:

可能重复:
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 有什么区别?

【问题讨论】:

  • @Kiyura 您的链接问题涉及术语。这个问题是关于性能的。
  • (Bob Ross) - “对 misInts 中的元素进行一些愉快的操作”
  • 你说得对,Rotem,我担心内存消耗和性能,因为这是一个更大的算法的一部分,循环中的循环无处不在。
  • @Rotem,这就是为什么它是评论而不是答案,也是为什么我没有说“重复”的原因,它只是为了指向 OP 可能尚未看到的信息的指针.

标签: c# arrays


【解决方案1】:

array.Count() 实际上是对Enumerable.Count&lt;T&gt;(IEnumerable&lt;T&gt;) 扩展方法的调用。

由于此方法采用IEnumerable&lt;T&gt;(与ICollection&lt;T&gt; 不同,后者具有Count 属性),它需要遍历整个序列以确定它有多大。

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

【讨论】:

  • 我在寻找 PowerShell 中 CountLength 之间的区别时遇到了这个答案。 在 PowerShell 中,应始终使用 Count 而不是 Length,因为即使 CountLength 为数组生成相同的结果,集合对象也不会为 @ 返回预期的结果987654336@。例如,([ordered]@{'a' = 0; 'bc' = 0;'def' = 0;}).Keys.Length 返回 1,2,3 而不是 3。这是因为Length 返回每​​个键的Length 属性列表,即每个字符串的长度。
【解决方案2】:

没有太大区别,因为如果Enumerable.Count 可转换为ICollection&lt;T&gt;,则它会先查找。

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

【讨论】:

  • 请不要:虽然您引用 ILSpy 作为您的来源,但这实际上 只是一个实现细节,它确实已记录在案。
  • @DanielHilgarth:我还链接了 MSDN,但由于在这种情况下源代码可读性很强,所以我已经证明了这一点。但是,编辑了我的答案以也引用 msdn 以使其清楚。
  • 我知道你链接了它。我只是想强调一个事实,即它不是一个实现细节,因为几天前我刚刚与其他人进行了确切的讨论。而且您的答案的结构方式看起来像是您仅从源代码而不是从文档中推断出此信息。
  • @DanielHilgarth:编辑了我的答案以使其更加清晰。但是由于 Slaks 在理论上已经回答了它,我只是想添加一些新的东西,而不是仅仅引用 MSDN 或重复他的回答。 Linq 对人们来说通常看起来很神奇,所以看看背后的代码可能会有所帮助。
  • +1 感谢您仍然添加报价 :-)
猜你喜欢
  • 2010-12-03
  • 2012-12-16
  • 2018-07-24
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 2012-12-02
相关资源
最近更新 更多