.NET数组 - "Length"、"Count()"和"Rank"之间的区别

51

"Length", "Count()"和"Rank"在.NET数组中有什么区别?

6个回答

62

Length是数组对象的属性,使用它是确定数组元素数量最有效的方法(请参考MSDN文档中的Array.Length)。

Count()是一个LINQ扩展方法,可以有效地实现相同的功能。它适用于数组,因为数组是可枚举对象。使用Length会更好,因为Count()可能更昂贵(有关详细讨论,请参见此问题计数的MSDN文档)。

Rank是返回维数(完全不同的东西)的属性。当您声明一个数组int[,] myArray = new int[5,10];时,它的Rank将为2,但它将保存50个元素(请参见Rank属性的MSDN文档)。


“Length”和“Count()”之间有区别吗?除非是LINQ扩展方法,否则不要使用“Count()”?” - Alexandre
@Alex Maslakov:据我所知,数组类型本身没有Count()方法。 - Dyppl
1
@Alex,Length 属于 Array 类,而 Count 是所有 Enumerable 类型的扩展方法。我猜 Array.Length 比 Count() 更快。然而,使用 Count() 可以使用谓词来计算满足条件的项目数量。 - Kornelije Petak
1
有额外的间接层,但对于数组,Count() 不会枚举数组:数组实现了 ICollection,因此 Count 属性最终将被计数扩展方法调用,这与 Length 相同。 - Bertrand Le Roy
@Dyppl:你的回答忽略了一个事实,即你也可以直接调用ICollection Count属性,通过var count = ((ICollection)myArray).Count;。当然,如果数组一开始就作为集合传递,那么它就直接使用它,如var count = col.Count; - jmoreno
显示剩余2条评论

24
  • Length: 数组中元素的总数
  • LongLength: 与Length相同,但以long形式返回(在它是>=231时)
  • Count(): LINQ 扩展方法,也适用于其他集合类型
  • Rank: 数组中维度的数量(向量始终为1)。仅在.NET 3.5+中。
  • GetLength()GetLongLength():数组中的某个维度的长度
  • GetLowerBound():数组中某个维度的起始索引;对于向量始终为0
  • GetUpperBound():数组中某个维度的结束索引;对于向量始终为Length - 1

有趣的是,这里没有GetLongUpperBound()GetLongLowerBound()...


既然提到了,.NET中的数组向量有什么区别呢?

Arrays versus Vectors

在C#中,向量是通常称为“1D”数组的数据结构。然而,1维数组实际上不像int[]那样是一种类型,而是一种int[*]类型。C#不直接支持它们,但是可以使用Array.CreateInstance创建它们,并且可以具有非零下限。然而,它们比向量稍微慢一些,因为向量直接受到CLR的支持。因为1维数组实际上很少使用,所以C#决定不支持它们(尽管可以通过在另一个模块中声明它们的var关键字来使用它们!)。


2
  • Length 是一个属性,返回 Array 中元素的数量。
  • Count() 是 LINQ 扩展方法,可以在 IEnumerable 上执行相同的操作。可选地,它可以接受谓词作为参数,并返回满足条件的元素数量。
  • Rank 是一个属性,返回 Array 中的维数。

0

Length 是数组的大小。
Count() 是数组中项目的数量(来自 system.linq)。
Rank 返回维数的数量(a[][] = 2,a[] = 1)。


2
实际上,类型为 T[][] 的数组的秩是1。它是一个一维数组,其元素是一维数组。秩为2的类型是 T[,] - phoog

0

.Count() 适用于 IEnumerableListArrayList 类型。而 Length 则适用于 Array

Rank 用于表示数组的维数


而对于字典呢?(计数 - Peter Mortensen

0

Length是自C# 1.x以来Array的一个属性。

Count()IEnumerable<T>的扩展方法,因为现在每个T[]都隐式实现了IEnumerable<T>

请注意,对于数组来说,Count()通常比Length慢得多,因为访问Length属性的时间复杂度是O(1),而Count是针对IEnumerable<T>的,所以程序需要遍历集合并获取其计数,时间复杂度为O(n)。

Rank给出了数组的维度。


1
不会慢太多,因为Count()方法的实现针对这种情况有一些内置的优化。此外,https://dev59.com/ZnNA5IYBdhLWcg3wZ81R - Dyppl
1
@Dyppl:嗯,“慢得多”并没有一个精确的标准。它需要10倍的时间,所以我说“慢得多”。但事实是,这10倍的时间少于0.1秒。 - Cheng Chen
1
@Dyppl:我用Stopwatch测试了一下。对于一个有10000个项目的数组,Count()的成本是10倍。 - Cheng Chen
好的,没问题,但重点是它在渐进意义下并不更复杂。 - Dyppl
3
需要更新这个回答:Count() 方法不会枚举数组,它对任何实现了 ICollection 接口的对象有一种优化处理。 - Bertrand Le Roy
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接