多维数组[] [] vs [,]

wil*_*007 424 c# arrays multidimensional-array

double[][] ServicePoint = new double[10][9]; // <-- gives an error (1)
double[,] ServicePoint = new double[10,9]; // <-- ok (2)
Run Code Online (Sandbox Code Playgroud)

他们的区别是什么?(1)产生错误,是什么原因?

double d = new double[9]
ServicePoint[0] = d;
Run Code Online (Sandbox Code Playgroud)

使用(2)将提示错误.为什么?

Jam*_*are 464

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

也就是说,a 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];
Run Code Online (Sandbox Code Playgroud)

因为数组中的每个条目都是对数组的引用double.使用锯齿状数组,您可以在第二个示例中对数组进行分配:

x[0] = new double[13];
Run Code Online (Sandbox Code Playgroud)

在第二项上,因为它是一个统一的2d数组,所以不能将1d数组分配给行或列,因为您必须将行和列都编入索引,这会将您归结为单个double:

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

ServicePoint[0]... // <-- meaningless, a 2d array can't use just one index.
Run Code Online (Sandbox Code Playgroud)

更新:

为了澄清你的问题,你的#1出现语法错误的原因是因为你有这个:

double[][] ServicePoint = new double[10][9];
Run Code Online (Sandbox Code Playgroud)

并且您无法在构造时指定第二个索引.关键是ServicePoint 不是 2d数组,而是1d数组(数组)因此,因为您要创建1d数组(数组),所以只指定一个索引:

double[][] ServicePoint = new double[10][];
Run Code Online (Sandbox Code Playgroud)

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

ServicePoint[0] = new double[13];
ServicePoint[1] = new double[20];
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!

  • 您不能在施工时指定第二个范围限制,只能指定第一个范围限制.在分配作为数组一部分的每个数组时指定第二个...我将更新并澄清: (3认同)

Pra*_*thy 211

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

double[][] ServicePoint = new double[10][9].
Run Code Online (Sandbox Code Playgroud)

如果定义如下,则上述陈述将起作用.

double[][] ServicePoint = new double[10][]
Run Code Online (Sandbox Code Playgroud)

这意味着你要创建一个大小为10的数组,它可以在其中存储10个不同大小的数组.简单来说就是一个数组数组.请看下面的图像,它表示一个锯齿状的数组.

在此输入图像描述

http://msdn.microsoft.com/en-us/library/2s05feca(v=vs.80).aspx

第二个基本上是二维数组,语法正确且可接受.

  double[,] ServicePoint = new double[10,9];//<-ok (2)
Run Code Online (Sandbox Code Playgroud)

要访问或修改二维数组,您必须传递两个维度,但在您的情况下,您只传递一个维度,这就是为什么错误

正确使用将是

ServicePoint[0][2] ,指第一行,第三列上的项目.

你的二维数组的图画代表

在此输入图像描述


Adi*_*dil 58

double[][]被称为锯齿状数组,声明中未指定内部维度.与矩形阵列不同,每个内部阵列可以是任意长度.每个内部数组都隐式初始化为null而不是空数组.必须手动创建每个内部数组:参考[C#4.0 in nutshell the the definitive Reference]

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;
}
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

  • 这里的示例对于显示如何使用GetLength(dimension)遍历数组的每个级别非常有用。 (2认同)

Oma*_*mar 19

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

double[][] ServicePoint = new double[10][];
Run Code Online (Sandbox Code Playgroud)


Ivo*_*Ivo 8

double[][]是一个数组数组,double[,]是一个矩阵.如果要初始化数组数组,则需要执行以下操作:

double[][] ServicePoint = new double[10][]
for(var i=0;i<ServicePoint.Length;i++)
    ServicePoint[i] = new double[9];
Run Code Online (Sandbox Code Playgroud)

考虑到使用数组数组将允许您拥有不同长度的数组:

ServicePoint[0] = new double[10];
ServicePoint[1] = new double[3];
ServicePoint[2] = new double[5];
//and so on...
Run Code Online (Sandbox Code Playgroud)