multidimensional array vs
double[][] ServicePoint = new double[10][9]; // <-- gives an error (1) double[,] ServicePoint = new double[10,9]; // <-- ok (2)
他们有什么不同? (1)产生错误,是什么原因?
和
double d = new double[9] ServicePoint[0] = d;
使用(2)会提示错误。 为什么?
一个是数组数组,一个是二维数组。 前者可以锯齿状,后者是统一的。
也就是说, double[][]
可以有效地是:
double[][] x = new double[5][]; x[0] = new double[10]; x[1] = new double[5]; x[2] = new double[3]; x[3] = new double[100]; x[4] = new double[1];
因为数组中的每个条目都是对double
数组的引用。 使用锯齿状的数组,您可以像第二个例子中那样对数组进行赋值:
x[0] = new double[13];
在第二项上,因为它是一个统一的2D数组,所以不能将1d数组分配给一个行或一列,因为您必须对行和列进行索引,从而使您得到一个double
:
double[,] ServicePoint = new double[10,9]; ServicePoint[0]... // <-- meaningless, a 2d array can't use just one index.
更新 :
为了澄清你的问题,你#1有一个语法错误的原因是因为你有这样的:
double[][] ServicePoint = new double[10][9];
在施工时你不能指定第二个索引。 关键是ServicePoint 不是 2d数组,而是1d数组(数组),因此,由于您要创build1d数组(数组),因此只需指定一个索引:
double[][] ServicePoint = new double[10][];
然后,当你在数组中创build每个项目时,每个项目也是数组,所以你可以指定它们的尺寸(可以是不同的,因此术语锯齿状的数组):
ServicePoint[0] = new double[13]; ServicePoint[1] = new double[20];
希望有所帮助!
在第一个例子中,你正试图创build一个叫锯齿状的数组。
double[][] ServicePoint = new double[10][9].
如果上面的语句像下面那样定义,那么这个语句就可以工作
double[][] ServicePoint = new double[10][]
这意味着你正在创build一个大小为10的数组,它可以在内部存储10个不同大小的数组。简单来说就是一个数组Array.see下面的图像,这意味着一个锯齿状的数组。
http://msdn.microsoft.com/en-us/library/2s05feca(v=vs.80).aspx
第二个基本上是一个二维数组,语法是正确的,可以接受的。
double[,] ServicePoint = new double[10,9];//<-ok (2)
而访问或修改二维数组,你必须通过这两个维度,但在你的情况下,你只传递一个维度,这就是为什么错误
正确的用法是
ServicePoint[0][2]
,指第一行第三列的项目。
你的二维数组的graphics代表
double[][]
被称为参差不齐的数组 ,声明中没有指定内部维数。 与矩形arrays不同,每个内部arrays可以是任意长度。 每个内部数组都隐式初始化为空而不是空数组。 每个内部数组必须手动创build:参考[C#4.0简介明确的参考]
for (int i = 0; i < matrix.Length; i++) { matrix[i] = new int [3]; // Create inner array for (int j = 0; j < matrix[i].Length; j++) matrix[i][j] = i * 3 + j; }
double[,]
被称为rectangular arrays
,用逗号分隔每个维度。 下面的一段代码声明了一个矩形3×3的二维数组,用0到8的数字对它进行初始化:
int [,] matrix = new int [3, 3]; for (int i = 0; i < matrix.GetLength(0); i++) for (int j = 0; j < matrix.GetLength(1); j++) matrix [i, j] = i * 3 + j;
double[,]
是一个2d数组(matrix),而double[][]
是一个数组(数组锯齿形数组 ),语法是:
double[][] ServicePoint = new double[10][];
double[][]
是一个数组数组, double[,]
是一个matrix。 如果你想初始化一个数组的数组,你将需要这样做:
double[][] ServicePoint = new double[10][] for(var i=0;i<ServicePoint.Length;i++) ServicePoint[i] = new double[9];
考虑到使用数组数组可以让你有不同长度的数组:
ServicePoint[0] = new double[10]; ServicePoint[1] = new double[3]; ServicePoint[2] = new double[5]; //and so on...