"Length", "Count()"和"Rank"在.NET数组中有什么区别?
Length
是数组对象的属性,使用它是确定数组元素数量最有效的方法(请参考MSDN文档中的Array.Length)。
Count()
是一个LINQ扩展方法,可以有效地实现相同的功能。它适用于数组,因为数组是可枚举对象。使用Length
会更好,因为Count()
可能更昂贵(有关详细讨论,请参见此问题和计数的MSDN文档)。
Rank
是返回维数(完全不同的东西)的属性。当您声明一个数组int[,] myArray = new int[5,10];
时,它的Rank
将为2,但它将保存50个元素(请参见Rank属性的MSDN文档)。
Length
: 数组中元素的总数LongLength
: 与Length
相同,但以long
形式返回(在它是>=231时)Count()
: LINQ 扩展方法,也适用于其他集合类型Rank
: 数组中维度的数量(向量始终为1)。仅在.NET 3.5+中。GetLength()
,GetLongLength()
:数组中的某个维度的长度GetLowerBound()
:数组中某个维度的起始索引;对于向量始终为0GetUpperBound()
:数组中某个维度的结束索引;对于向量始终为Length - 1
有趣的是,这里没有GetLongUpperBound()
或GetLongLowerBound()
...
既然提到了,.NET中的数组和向量有什么区别呢?
在C#中,向量是通常称为“1D”数组的数据结构。然而,1维数组实际上不像int[]
那样是一种类型,而是一种int[*]
类型。C#不直接支持它们,但是可以使用Array.CreateInstance
创建它们,并且可以具有非零下限。然而,它们比向量稍微慢一些,因为向量直接受到CLR的支持。因为1维数组实际上很少使用,所以C#决定不支持它们(尽管可以通过在另一个模块中声明它们的var
关键字来使用它们!)。
Length
是一个属性,返回 Array
中元素的数量。Count()
是 LINQ 扩展方法,可以在 IEnumerable
上执行相同的操作。可选地,它可以接受谓词作为参数,并返回满足条件的元素数量。Rank
是一个属性,返回 Array
中的维数。Length 是数组的大小。
Count() 是数组中项目的数量(来自 system.linq)。
Rank 返回维数的数量(a[][] = 2,a[] = 1)。
T[][]
的数组的秩是1。它是一个一维数组,其元素是一维数组。秩为2的类型是 T[,]
。 - phoog.Count()
适用于 IEnumerable
、List
或 ArrayList
类型。而 Length
则适用于 Array
。
Rank
用于表示数组的维数。
Length
是自C# 1.x以来Array
的一个属性。
Count()
是IEnumerable<T>
的扩展方法,因为现在每个T[]
都隐式实现了IEnumerable<T>
。
请注意,对于数组来说,Count()
通常比Length
慢得多,因为访问Length
属性的时间复杂度是O(1),而Count
是针对IEnumerable<T>
的,所以程序需要遍历集合并获取其计数,时间复杂度为O(n)。
Rank
给出了数组的维度。
Count()
方法的实现针对这种情况有一些内置的优化。此外,https://dev59.com/ZnNA5IYBdhLWcg3wZ81R - DypplStopwatch
测试了一下。对于一个有10000个项目的数组,Count()
的成本是10倍。 - Cheng Chen
Count()
方法。 - Dypplvar count = ((ICollection)myArray).Count;
。当然,如果数组一开始就作为集合传递,那么它就直接使用它,如var count = col.Count;
。 - jmoreno