
7.3. Виды массивов и массивы многомерные
Размерностью массива называют количество индексов, которое необходимо для получения доступа к отдельному элементу массива.
Рассмотренные нами одномерные массивы являются частным случаем всего разнообразия массивов, которые можно использовать в С#. Для этих массивов размерность равна 1, а размер одномерного массива определяется числом возможных значений индекса.
В общем случае тип массива объявляется с помощью конструкции:
тип_не_массива спецификаторы_размерностей
тип_не_массива это один из следующих типов:
тип_значения
тип_класса
тип_интерфейса
тип_лелегата
спецификатор размерности - это [] или [разделители__размеров];
разделитель_размеров это запятая. Количество запятых на 1 меньше соответствующей размерности массива.
Спецификаторы размерностей размещаются подряд в нужном количестве после типа_не_массива. Рассмотрим случай, когда спецификатор размерности один. Например:
type[R] - тип одномерного массива с R элементами типа type.
Важными частными случаями типов массивов с одним спецификатором размерности кроме типов одномерных массивов являются "прямоугольные" типы массивов, то есть двумерные (матрицы), трехмерные («параллелепипеды») и т.д. Именно такие массивы традиционно принято называть многомерными массивами. Примеры:
int [,] dots; //ссылка на двумерный массив
byte [„] bits; //ссылка на трёхмерный массив
Для определения объекта - конкретного экземпляра типа многомерных массивов используется выражение с операцией new
new тип_не_массива [d1,d2, из...] инициализатор
Здесь dj - размер - количество элементов по соответствующему измерению. Инициализатор представляет собой вложение конструкций
{список_инициализаторов}.
Элементами такого списка в свою очередь служат заключенные в фигурные скобки списки инициализаторов. Глубина вложения соответствует размерности массива. Размерность массива можно получить с помощью нестатического свойства Rank.
Пример определения с использованием инициализации матрицы (двумерного массива) с размерами 4 на 2:
int [,] matr = new int[4,2] {{1,2},{3,4},{5,6},{7,8}};
Как и для одномерных массивов при наличии инициализатора конструкцию new int[4,2] можно опустить.
Так как размеры объектов-массивов задаются выражениями, в которые могут входить переменные, то допустимы многомерные массивы с динамически определяемыми размерами. В качестве примера рассмотрим программу, формирующую единичную матрицу, размеры которой вводит пользователь с клавиатуры:
// 07_05.cs - двумерный массив - единичная матрица
static void Main()
{
int size;
do
Console.Write("size = ");
while (!int.TryParse(Console.ReadLine(), out size) || size < 1);
int[,] one = new int[size, size];
for (int i = 0; i < size; i++, Console.WriteLine())
for (int j = 0; j < size; j++)
{
if (i == j)
one[i,j] = 1;
Console.Write(one[i, j] + "\t");
}
foreach (int mem in one)
Console.Write(mem+" ");
Console.WriteLine();
Console.WriteLine("one.Length = " + one.Length);
Console.WriteLine("one.Rank = " + one.Rank);
}
Результат |
выполнения программы: | ||
size |
= 4<ENTER> | ||
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
1000010000100001 one.Length = 16 one.Rank = 2
В программе формируется двумерный массив (экземпляр массивов типа [,]), размеры которого определены переменной size. Значение size вводит пользователь. По умолчанию все элементы массива получают нулевое значение. Во вложенных циклах диагональным элементам присвоены единичные значения и выводятся значения всех элементов. Обратите внимание, как в заголовке внешнего цикла for используется обращение к методу Console.WriteLine() для перехода на новую строку при выводе. Далее иллюстрируется применение цикла foreach к многомерному массиву. Перебор значений массива, представляющего матрицу, выполняется по строкам. (Быстрее изменяется правый индекс.)
В конце программы выведено значение свойства one.Length - это общее количество элементов в массиве и значение ранга массива – ранг равен двум.