-
В чем разница между массивным массивом и многомерным массивом. Есть ли преимущество одного на другое?
-
И почему Visual Studio не разрешит мне делать
MyClass[][] abc = new MyClass[10][20];
(Мы использовали это в С++, но в С# он подчеркивает [20] с красной изгибной строкой.. Говорит недействительный спецификатор ранга)
но счастлив
MyClass[,] abc = new MyClass[10,20];
-
Наконец, как я могу инициализировать это в одной строке (как в простом массиве с
{new xxx...}{new xxx....}
)MyClass[][,][,] itemscollection;
Почему у нас есть как зубчатый массив, так и многомерный массив?
Ответ 1
Зубчатый массив - это массив массивов, поэтому
int[][]
- это массивint[]
, каждый из которых может иметь разную длину и занимать свой собственный блок в памяти. Многомерный массив (int[,]
) - это один блок памяти (по сути, матрица).Вы не можете создать
MyClass[10][20]
, потому что каждый вложенный массив должен быть инициализирован отдельно, так как они являются отдельными объектами:MyClass[][] abc = new MyClass[10][]; for (int i=0; i<abc.Length; i++) { abc[i] = new MyClass[20]; }
A
MyClass[10,20]
- это нормально, потому что он инициализирует один объект в виде матрицы с 10 строками и 20 столбцами.MyClass[][,][,]
может быть инициализирован следующим образом (хотя и не тестируется при компиляции):MyClass[][,][,] abc = new MyClass[10][,][,]; for (int i=0; i<abc.Length; i++) { abc[i] = new MyClass[20,30][,]; for (int j=0; j<abc[i].GetLength(0); j++) { for (int k=0; k<abc[i].GetLength(1); k++) { abc[i][j,k] = new MyClass[40,50]; } } }
Имейте в виду, что CLR сильно оптимизирован для доступа к одномерному массиву, поэтому использование зубчатого массива, вероятно, будет быстрее, чем многомерный массив того же размера.
Ответ 2
Яичный массив - это массив массивов. Каждой массиве не гарантируется одинаковый размер. У вас может быть
int[][] jaggedArray = new int[5][];
jaggedArray[0] = { 1, 2, 3 }; // 3 item array
jaggedArray[1] = new int[10]; // 10 item array
// etc.
Это набор связанных массивов.
С другой стороны, многомерный массив представляет собой скорее сплоченную группировку, такую как поле, таблица, куб и т.д., где нет нерегулярных длин. То есть
int i = array[1,10];
int j = array[2,10]; // 10 will be available at 2 if available at 1
Ответ 3
Прямоangularьный массив всегда имеет одинаковое количество столбцов для каждой строки.
MyClass[,] x = new MyClass[10,30]
Каждая строка имеет 30 столбцов, тогда как в зубчатом массиве это не требуется. Поэтому я думаю, что вам придется инициализировать каждую "строку" в зубчатом массиве отдельно:
MyClass[][] x = new MyClass[10][];
for(int i = 0; i < 10; i++)
{
x[i] = new MyClass[30];
}
На самом деле это означает, что не каждая строка в массиве с зазубринами должна содержать одинаковое количество элементов. (В моем примере у него одинаковое количество элементов, но это не обязательно).
Вы можете прекрасно это сделать, например:
MyClass[][] x = new MyClass[10][];
for(int i = 0; i < 10; i++)
{
x[i] = new MyClass[(30 + i)];
}
Эта может быть интересной статьей для вас.
Ответ 4
Ad 3) Чтобы инициализировать такого монстра, как [][,][,]
, вы можете сделать так:
int [,][,] multiArr1 = { { new int[,] { { 2, 2 }, { 1, 1 } },
new int[,] { { 2, 2 }, { 1, 1 } } },
{ new int[,] { { 2, 2 }, { 1, 1 } },
new int[,] { { 2, 2 }, { 1, 1 } } } };
int [,][,] multiArr2 = { { new int[,] { { 2, 2 }, { 1, 1 } },
new int[,] { { 2, 2 }, { 1, 1 } } },
{ new int[,] { { 2, 2 }, { 1, 1 } },
new int[,] { { 2, 2 }, { 1, 1 } } } };
int [][,][,] superMultiArray = { multiArr1, multiArr2 };
Ответ 5
Если вы ищете многомерный массив с установленными границами, всегда используйте синтаксис стиля [,]
. Это гарантирует, что каждая часть имеет одинаковый размер.
Когда вы используете [][]
, что действительно происходит, вы создаете массив массивов. Это означает, что каждый массив может быть разным. Например:
int[][] jaggedArray = new int[5][]
for(int index = 0; index < jaggedArray.Length ; ++index)
{
jaggedArray[index] = new int[index + 1];
}
Ответ 6
Объявление inline будет выглядеть примерно так:
int[,] numbers = { {1, 2}, {3, 4}, {5, 6} };
Ответ 7
Для # 1, смотрите этот вопрос
Для неровных или многомерных встроенных массивов см. это руководство по программированию:
// Three-dimensional array.
int[, ,] array3D = new int[,,] { { { 1, 2, 3 }, { 4, 5, 6 } },
{ { 7, 8, 9 }, { 10, 11, 12 } } };
// Same array with dimensions specified at declaration.
int[, ,] array3Da = new int[2, 2, 3] { { { 1, 2, 3 }, { 4, 5, 6 } },
{ { 7, 8, 9 }, { 10, 11, 12 } } };
Вам не нужно указывать размеры (array3D), но если вы знаете, что они никогда не изменятся, полезно знать, какие измерения вы используете (array3Da).
Ответ 8
Вам нужно будет понять внутреннюю работу массива многомерный массив действует как единый размерный массив, за исключением того, что двойное индексирование преобразуется в один.
Ваш массив Jagged в С# представляет собой массив объектов, находящихся в очереди массивов.
Ответ 9
Я думаю, что распределение двумерных зубчатых массивов в С# подобно двумерным массивам в C++ и C. Поскольку двумерные зубчатые массивы имеют указатель, который указывает на массив указателей, каждый из этих указателей указывает на массив элементов (например, целочисленных элементов); как этот код в C++,
int** 2DArr {new int* [number1]};
for (int i = 0; i < number1; i++)
{
2DArr[i] = new int[number2];
}
выделение памяти для кода ниже такое же, как для двумерных зубчатых массивов в С#. Но я сомневаюсь, не могли бы вы объяснить больше, если я думаю, что неправильно.
Ответ 10
Этот пост старый, но вот мои мысли по этому поводу.
Зубчатые массивы - это многомерные массивы. Многомерные массивы бывают двух видов: прямоangularьные и зубчатые. прямоangularьные массивы представляют собой n-мерный блок памяти, а неровные массивы - это массивы массивов.
Прямоangularьные массивы
Прямоangularьные массивы объявляются с помощью запятых для разделения каждого измерения. Следующее утверждение объявляет прямоangularьный двумерный массив с размерами 3 × 3:
int[,] matrix = new int [3, 3];
Зубчатые массивы
Зубчатые массивы объявляются с использованием последовательных квадратных скобок для представления каждого измерения. Вот пример объявления зубчатого двумерного массива, где крайний размер равен 3:
int[][] matrix = new int[3][];