Книга: 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++, можно определить неровный массив с любым рангом, необходимо просто добавить прямоугольные скобки в его определение.

Оглавление книги


Генерация: 0.358. Запросов К БД/Cache: 0 / 2
поделиться
Вверх Вниз