使用name[x,y]而不是name[x][y]的数组写法

3
这两种语法有什么不同?
3个回答

8
第一个是多维数组,而第二个是交错数组。 您可以查看此问题以了解两者之间的差异,但以下是一段重要的代码片段:

多维数组创建了一个漂亮的线性内存布局,而交错数组意味着几个额外的间接级别。

在交错数组var jagged = new int[10][5]中查找jagged [3] [6]的值的方法如下:查找索引为3的元素(它是一个数组),并在该数组(它是一个值)中查找索引为6的元素。对于每个维度,都有一个额外的查找(这是昂贵的内存访问模式)。

多维数组在内存中按线性方式排列,实际值通过将索引相乘来找到。然而,给定数组var mult = new int[10,30]的Length属性返回元素的总数,即10 * 30 = 300。

交错数组的Rank属性始终为1,但多维数组可以具有任何秩。任何数组的GetLength方法都可以用于获取每个维度的长度。在此示例中,多维数组mult.GetLength(1)返回30.

索引多维数组更快,例如,在此示例中给定的多维数组mult[1,7] = 30 * 1 + 7 = 37,获取该索引处的元素37。这是更好的内存访问模式,因为仅涉及一个内存位置,即数组的基地址。

因此,多维数组分配了一个连续的内存块,而交错数组不必像正方形一样。例如,jagged 1 .Length不必等于jagged [2].Length,这对于任何多维数组都是正确的。

更新:

多和交错数组之间的一个主要区别是,多必须始终是“方形”,这意味着任何两个索引在其子数组中具有相同数量的元素。交错数组没有此要求。请查看下面的代码:

var jagged = new int[3][]; //not defining the size of the child array...
var multi = new int[3,8]; //defining a 3x8 "square"
var multiBad = new int[3,]; //Syntax error!
var jaggedSquare= new int[3][8]; //another 3x8 "square"

但就使用它们而言(在表面上),它们本质上做的是相同的事情,对吗? - Dollarslice
另一方面,锯齿数组可能是稀疏的,可以节省内存并改善多维数组的局部性。 - Gabe
@SirYakalot,不完全是这样。看看我的更新。 - Abe Miessler

2
前者是一个二维数组。后者是一个元素也是数组的数组。

2
第一种是用于多维数组的情况, 第二种是用于数组的数组的情况。

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