double[][] ServicePoint = new double[10][9]; // <-- gives an error (1)
double[,] ServicePoint = new double[10,9]; // <-- ok (2)
它们有什么不同?(1)产生错误,原因是什么?
And
double d = new double[9]
ServicePoint[0] = d;
使用(2)将提示错误。为什么?
double[][] ServicePoint = new double[10][9]; // <-- gives an error (1)
double[,] ServicePoint = new double[10,9]; // <-- ok (2)
它们有什么不同?(1)产生错误,原因是什么?
And
double d = new double[9]
ServicePoint[0] = d;
使用(2)将提示错误。为什么?
当前回答
在第一个实例中,您试图创建所谓的锯齿数组。
double[][] ServicePoint = new double[10][9].
如果上面的语句像下面这样定义,那么它就可以工作。
double[][] ServicePoint = new double[10][]
这意味着你创建了一个大小为10的数组,可以在其中存储10个大小不同的数组。简单来说就是数组的数组。请看下图,它表示一个锯齿状数组。
http://msdn.microsoft.com/en-us/library/2s05feca (v = vs.80) . aspx
第二个基本上是一个二维数组,语法是正确的,可以接受的。
double[,] ServicePoint = new double[10,9];//<-ok (2)
要访问或修改一个二维数组,你必须传递两个维度,但在你的例子中,你只传递了一个维度,这就是为什么会出现错误
正确的用法是
ServicePoint[0][2],第一行第三列。
二维数组的图像代表
其他回答
double[][]被称为锯齿数组,内部尺寸没有在声明中指定。与矩形数组不同,每个内数组可以是任意长度。每个内部数组都隐式初始化为null,而不是空数组。每个内部数组必须手动创建:参考[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;
}
双[,]被称为矩形数组,使用逗号分隔每个维度。下面的代码声明了一个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[,]是一个二维数组(矩阵),而Double[][]是一个数组的数组(锯齿数组),语法为:
double[][] ServicePoint = new double[10][];
一个是数组的数组,一个是二维数组。前者可以呈锯齿状,后者则呈均匀状。
也就是说,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[,] 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不是一个二维数组,而是一个一维数组(数组的),因此,由于你正在创建一个一维数组(数组的),你只指定一个索引:
double[][] ServicePoint = new double[10][];
然后,当你在数组中创建每一项时,每一项都是数组,所以你可以指定它们的维度(可以是不同的,因此有了术语锯齿数组):
ServicePoint[0] = new double[13];
ServicePoint[1] = new double[20];
在第一个实例中,您试图创建所谓的锯齿数组。
double[][] ServicePoint = new double[10][9].
如果上面的语句像下面这样定义,那么它就可以工作。
double[][] ServicePoint = new double[10][]
这意味着你创建了一个大小为10的数组,可以在其中存储10个大小不同的数组。简单来说就是数组的数组。请看下图,它表示一个锯齿状数组。
http://msdn.microsoft.com/en-us/library/2s05feca (v = vs.80) . aspx
第二个基本上是一个二维数组,语法是正确的,可以接受的。
double[,] ServicePoint = new double[10,9];//<-ok (2)
要访问或修改一个二维数组,你必须传递两个维度,但在你的例子中,你只传递了一个维度,这就是为什么会出现错误
正确的用法是
ServicePoint[0][2],第一行第三列。
二维数组的图像代表
Double[][]是数组的数组,Double[,]是矩阵。如果你想初始化一个数组的数组,你需要这样做:
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...