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)会提示错误。为什么呢?
答案 0 :(得分:441)
一个是数组数组,一个是二维数组。前者可以是锯齿状的,后者是统一的。
也就是说,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数组分配给行或列,因为你必须为行和列编制索引,这会使你只能归结为{{1 }}:
double
<强>更新强>:
根据您的问题澄清,您的#1出现语法错误的原因是因为您有这个:
double[,] ServicePoint = new double[10,9];
ServicePoint[0]... // <-- meaningless, a 2d array can't use just one index.
您无法在施工时指定第二个索引。关键是ServicePoint 不是一个2d数组,而是一个1d数组(数组)因此,因为您要创建一个1d数组(数组),所以只指定一个索引:
double[][] ServicePoint = new double[10][9];
然后,当你在数组中创建每个项目时,每个项目也都是数组,所以然后你可以指定它们的维度(可以是不同的,因此术语锯齿状的 array):
double[][] ServicePoint = new double[10][];
希望有所帮助!
答案 1 :(得分:207)
在第一个实例中,您正在尝试创建所谓的锯齿状数组。
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]
,指第一行第三列的项目。
你的二维数组的图片代表
答案 2 :(得分:56)
double[][]
被称为jagged arrays,内部维度未在声明中指定。与rectangular array不同,每个内部数组可以是任意长度。每个内部数组都隐式初始化为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;
}
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;
答案 3 :(得分:19)
double[,]
是一个二维数组(矩阵),而double[][]
是一个数组数组(jagged arrays),语法是:
double[][] ServicePoint = new double[10][];
答案 4 :(得分:8)
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...