489
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)会提示错误。为什么?

4

5 回答 5

541

一个是数组数组,一个是二维数组。前者可以是锯齿状的,后者是均匀的。

也就是说,adouble[][]可以有效地是:

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];

在第二项上,因为它是一个统一的二维数组,所以不能将一维数组分配给行或列,因为您必须同时索引行和列,这会使您降到一个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不是二维数组,而是一维数组(数组),因此由于您正在创建一维数组(数组),因此您只指定一个索引:

double[][] ServicePoint = new double[10][];

然后,当您在数组中创建每个项目时,每个项目也是数组,因此可以指定它们的维度(可以不同,因此术语锯齿状数组):

ServicePoint[0] = new double[13];
ServicePoint[1] = new double[20];

希望有帮助!

于 2012-09-24T14:44:16.083 回答
235

在第一个实例中,您尝试创建所谓的锯齿状数组。

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],指第一行第三列的一个项目。

二维数组的图形表示

在此处输入图像描述

于 2012-09-24T14:53:54.580 回答
68

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;
}

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;
于 2012-09-24T14:45:29.687 回答
23

double[,]是一个二维数组(矩阵),double[][]而是一个数组数组(锯齿状数组),语法是:

double[][] ServicePoint = new double[10][];
于 2012-09-24T14:45:37.727 回答
9

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...
于 2012-09-24T14:49:24.063 回答