首页 文章

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

提问于
浏览
382

这个问题在这里已有答案:

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)将提示错误 . 为什么?

5 回答

  • 7

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

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

    double[,] ServicePoint = new double[10,9];
    
    ServicePoint[0]... // <-- meaningless, a 2d array can't use just one index.
    

    UPDATE

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

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

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

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

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

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

    希望有所帮助!

  • 19

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

    double[][] ServicePoint = new double[10][9].
    

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

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

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

    enter image description here

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

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

    double[,] ServicePoint = new double[10,9];//<-ok (2)
    

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

    正确使用将是

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

    你的二维数组的图画代表

    enter image description here

  • 420

    double[][] 被称为jagged arrays,内部尺寸未在声明中指定 . 与rectangular array不同,每个内部数组可以是任意长度 . 每个内部数组都隐式初始化为null而不是空数组 . Each inner array must be created manually: 参考文献[简称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;
    
  • 197

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

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

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

相关问题