Книга: C# для профессионалов. Том II
Многомерные массивы
Многомерные массивы
C# существенно отклонился от C++ в вопросе многомерных массивов, так как C# поддерживает как прямоугольные, так и неровные массивы.
Прямоугольный массив является правильной сеткой чисел. В C# это указывается синтаксисом, где запятая разделяет число элементов в каждой размерности. Например, двухмерный прямоугольный массив, можно определить следующим образом:
int [,] MyArray2d;
MyArray2d = new int[2, 3] {{1, 0}, {3, 6}, {9, 12}};
Синтаксис здесь является интуитивно понятным расширением синтаксиса одномерных массивов. Список инициализации в таком коде может отсутствовать. Например:
int [,,] MyArray3d = new int [2, 3, 2];
Это приведет к вызову конструктора по умолчанию для каждого элемента и к инициализации каждого int
нулем. В этом частном примере проиллюстрировано создание трехмерного массива. Общее число элементов в массиве равно 2?3?2 = 12. Характеристика прямоугольных массивов состоит в том, что все строки имеют одинаковое число элементов.
Элементы прямоугольного массива доступны с помощью следующего синтаксиса.
int X = MyArray3d[1, 2, 0] + MyArray2d[0, 1];
Прямоугольный массив C# не имеет прямых аналогов в C++. Однако неровные массивы в C# соответствуют достаточно точно многомерным массивам C++. Например, если объявить в C++ массив следующим образом:
int MyCppArray[3][5];
то реально объявляется не массив 3?5, а массив массивов — массив размера 3, каждый элемент которого является массивом размера 5. Это будет, возможно, понятнее, если сделать то же самое динамически. Запишем:
int pMyCppArray = new int[3];
for (int i=0; i<3; i++) pMyCppArray[i] = new int[5];
Из этого кода должно быть видно, что теперь не существует причины, чтобы каждая строка содержала одинаковое число элементов (хотя это вполне может быть, как в данном примере). В качестве примера неровного массива в C++, который имеет различное число элементов в каждой строке, можно написать:
int pMyCppArray = new int[3];
for (int i=0; i<3; i++) pMyCppArray[i] = new int[2*i + 2];
Соответствующие строки этого массива имеют размерности 2, 4 и 6. C# делает те же самые вещи почти таким же образом, хотя в случае C# синтаксис указывает число размерностей более явно:
int[][] MyJaggedArray = new int[3][];
for (int i = 0; i < 3, i++) MyJaggedArray[i] = new int[2*i + 2];
Доступ к членам неровного массива следует точно тому же синтаксису, что и в C++.
int X = MyJaggedArray[1][3];
Здесь показан неровный массив ранга 2. Однако так же, как и в C++, можно определить неровный массив с любым рангом, необходимо просто добавить прямоугольные скобки в его определение.
- 3. МАССИВЫ
- Глава 5. Указатели и массивы
- УКАЗАТЕЛИ И МНОГОМЕРНЫЕ МАССИВЫ
- Функции и многомерные массивы
- 11.10. Десериализация нотации JSON в массивы и словари
- 8.1.11. Многомерные массивы
- ФУНКЦИИ, МАССИВЫ И УКАЗАТЕЛИ
- МНОГОМЕРНЫЕ МАССИВЫ
- 5.3 Указатели и массивы
- 7.7. Многомерные массивы
- 5.7 Многомерные массивы
- 3.1. Многомерные массивы