Многомерный массив [] [] vs [,]

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), выдается сообщение об ошибке. Почему?

Ответ 1

Один представляет собой массив массивов, а один - массив 2d. Первый может быть зазубрен, последний является однородным.

То есть 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];

Поскольку каждая запись в массиве является ссылкой на массив 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-массивом, а 1-м массивом (массивов), и, таким образом, поскольку вы создаете массив 1d (массивов), вы указываете только один индекс:

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

Затем, когда вы создаете каждый элемент в массиве, каждый из них также является массивом, поэтому вы можете указать их размеры (которые могут быть разными, следовательно, термин "зазубренный массив" ):

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

Надеюсь, что это поможет!

Ответ 2

В первом случае вы пытаетесь создать так называемый зубчатый массив.

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

Ответ 3

double[][] называются зубчатые массивы. Аргумент внутренних измерений, указанный в объявлении. В отличие от прямоугольного массива, каждый внутренний массив может быть произвольной длиной. Каждый внутренний массив неявно инициализируется нулевым, а не пустым массивом. Каждый внутренний массив должен быть создан вручную: Ссылка [С# 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;

Ответ 4

double[,] - это 2d-массив (матрица), а double[][] - массив массивов (зубчатые массивы), а синтаксис:

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

Ответ 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...