Многомерный массив [] [] 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...