【发布时间】:2011-10-02 13:14:58
【问题描述】:
.NET 数组的“Length”、“Count()”和“Rank”有什么区别?
【问题讨论】:
.NET 数组的“Length”、“Count()”和“Rank”有什么区别?
【问题讨论】:
Length 是数组对象的属性,使用它是确定数组中元素计数的最有效方法 (Array.Length in MSDN documentation)。
Count() 是一个LINQ 扩展方法,其效果相同。它适用于数组,因为数组是可枚举的对象。最好使用Length,因为Count() 可能更贵(更多讨论请参阅this question,参考MSDN documentation on Count)。
Rank 是返回维数的属性(完全不同)。当你声明一个数组int[,] myArray = new int[5,10]; 时,它的Rank 将是2,但它总共会包含50 个元素(MSDN on Rank property)。
【讨论】:
Count() 方法 afaik
Count() 调用可能更昂贵(即使在某些情况下它同样便宜),这正是我写的,还是我错过了什么?
Length: 数组中的元素总数
LongLength:与Length 相同,但返回为long(如果 >= 231)Count():LINQ 扩展方法也适用于其他集合类型Rank:数组中维度的数量(对于向量,总是1)。仅在 .NET 3.5+ 中。GetLength(),GetLongLength():数组的某个维度的长度
GetLowerBound():数组某个维度的起始索引;总是0 用于向量GetUpperBound():数组某个维度的结束索引;总是Length - 1 用于向量有趣的是,没有GetLongUpperBound() 或GetLongLowerBound()...
现在我们谈到了这个话题,.NET 中的 array 和 vector 有什么区别?
向量是您在 C# 中通常所说的“一维”数组。但是,一维数组实际上不是int[] 之类的类型,而是int[*] 类型。 C# 不直接支持它们;但是,它们可以使用Array.CreateInstance 创建,并且可以具有非零下限。但是,它们比向量稍慢,因为 CLR 直接支持向量。因为一维数组实际上很少使用,C# 决定不支持它们(尽管它可以通过使用 var 关键字来使用它们,来自另一个声明它们的模块!)。
【讨论】:
Length 是返回 Array 中元素数量的属性。Count() 是一个 LINQ 扩展,在 IEnumerable 上做同样的事情。可选地,它可以将谓词作为参数,并返回满足它的元素的数量。Rank 是一个属性,返回 Array 中的维数。【讨论】:
.Count() 适用于 IEnumerable、List 或 ArrayList 类型。而Length 代表Array。
Rank 表示数组的维数。
【讨论】:
Length 是 Array 自 C# 1.x 以来的属性
Count()是IEnumerable<T>的扩展方法,因为现在每个T[]都隐式实现了IEnumerable<T>。
注意,对于数组,Count() 通常比Length 慢得多, 因为访问Length 属性是O(1),而Count 是针对IEnumerable<T>,所以程序需要遍历集合并得到它的计数,即O(n)。
Rank 给出了数组的维度。
【讨论】:
much slower 因为Count() 方法的实现有一些专门针对这种情况的内置优化。另外,stackoverflow.com/questions/981254/…
much slower 没有基于精确的标准。它花费 10 倍的时间,所以我说“慢得多”。但事实是,10x 时间不到 0.1 秒。
Stopwatch 进行了测试。 Count() 包含 10000 个项目的数组需要 10 倍的时间。
Length 是数组的大小。
Count() 是数组中项目的数量(来自 system.linq)
Rank 返回维数(a[][] = 2, a[] = 1)。
【讨论】:
T[][]类型的数组的秩是1。它是一个一维数组,其元素是一维数组。 rank为2的类型是T[,]。