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...