【问题标题】:Multidimensional Array [][] vs [,] [duplicate]多维数组 [][] 与 [,] [重复]
【发布时间】:2012-09-16 01:09:46
【问题描述】:
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[,] d = new double[9,9];?哦,等等我明白你的意思,我想。如果你的意思是“有没有办法一次初始化一个数组数组”,那么不,你不能那样做。
  • 第一个样本 ([][]) 通常称为“锯齿状数组”,但当您称其为“数组数组”时,问题更容易理解。
  • 备案:double d = new double[9]; 应为:double[] d = new double[9];

标签: c# arrays multidimensional-array


【解决方案1】:

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

也就是说,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];

关于第二个项目,因为它是一个统一的二维数组,所以不能将一维数组分配给行或列,因为您必须同时索引行和列,这会使您下降到单个 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][];

然后,当您在数组中创建每个项目时,每个项目也是数组,因此 然后 您可以指定它们的尺寸(可以不同,因此术语 jagged em> 数组):

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

希望有帮助!

【讨论】:

  • 嗨,(1)给我语法错误,是什么原因?
  • 构造时不能指定第二个范围限制,只能指定第一个。您在分配属于数组的每个数组时指定第二个...我将更新并澄清:
  • 您好。非常感谢。有价值的信息。
  • 为什么左边被认为是“外部”数组?
【解决方案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],指第一行第三列的一个项目。

二维数组的图示

【讨论】:

    【解决方案3】:

    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;
    

    【讨论】:

    • 嗨,(1)给我语法错误,是什么原因?
    • 这里的例子对于展示如何使用GetLength(dimension)遍历数组的每一层非常有用。
    【解决方案4】:

    double[,] 是一个二维数组(矩阵),而double[][] 是一个数组数组(jagged arrays),语法是:

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

    【讨论】:

    • 好吧,这似乎只是一个答案。没错,但它只解决了 OP 中的一些问题。
    【解决方案5】:

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

    【讨论】:

    • long[,] data = new long[2, 4]{ {1,2,3,4}, {7,8,9,10} };和 long[][] data2 = new long[2][] { new long[4]{1,2,3,4}, new long[4]{7,8,9,10} };有相同的结果。但是,一个是长数组数组,另一个是长数组的二维数组
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2011-02-18
    • 2018-04-03
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多