Работа с массивами. Базовый класс System.Array
Если переменных много, программа, предназначенная для их обработки, получается длинной и однообразной; Поэтому в любом процедурном языке есть понятие массива m ограниченной совокупности однотипных.величин.
Элементы массива имеют одно и тоже имя, а различаются порядковым номером (индексом). Это позволяет компактно записывать множество операций с помощьюциклов.
Массив относится к ссылочным типам данных, то есть располагается в динамической области памяти, поэтому создание массива начинается, с выделения памятипод его элементы. Элементами массива могут быть величины как значимых,так и ссылочных типов (в том числе, массивы). Массив значимых типов хранитзначения, массивссылочных типов - ссылки, на элементы. Всем элементам при создании массива присваивается значение по умолчанию; нули для значимых типов и null– для ссылочных.
Вот, например, как выглядят операторы создание массива из 10 целых чисел и массива из 100 строк:
int[] w = new int[10];
string[] z = new string[100];
В первом операторе описан массив w типа int[].Операция new выделяет память под 10 целых элементов, и они заполняются нулями.
Во втором операторе описан массив z типа string[].Операция new выделяет память под 100 ссылок на строки, и эти ссылки заполняются значением null.Память под сами строки, составляющие массив, не выделяется — это будет необходимосделать перед заполнением массива.
Количество элементов в массиве (размерность) не является частью его типа, это количество задается при выделении памяти и не может быть измененовпоследствии. Размерность может задаваться не только константой, но и выражением.Результат вычисления этого выражения должен быть неотрицательным, а его тип должен иметь неявное преобразование к int, uint, long или ulong.
Элементы массива нумеруются с нуля, поэтому максимальный номер элементавсегда на единицу меньше размерности. Для обращения к элементу массивапосле имени массива указывается номер элемента в квадратных скобках, например:
w[4]
Если значение индекса выходит за границы массива, генерируется исключениеIndexOutOfRangeException.
Массивы одного типа можно присваивать друг другу. При этом происходит присваивание ссылок, а не элементов, как и для любого другого объекта ссылочного
типа, например:
int[] а - new int[10];
int[] b = а; // b и а указывают на один,и тот же массив
Все массивы в С# имеют общий базовый класс Array, определенный в пространстве имен System. В нем есть несколько полезных методов, упрощающих работу с массивами, например, методы получения размерности, сортировки и поиска.
System.Array
Содержит множество методов и свойств, например:
• Length – свойство, возвращает количество элементов массива;
• Clear – статический метод, присваивание всем элементам значения по умолчанию;
• Copy – статический метод, копирование заданного диапазона элементов одного массива в другой;
• Sort – статический метод, упорядочивает элементы одномерного массива.
Свойство Length позволяет реализовывать алгоритмы, которые будут работатьс массивами различной длины или, например, со ступенчатым массивом. Использование этого свойства вместо явного задания размерности исключает возможность выхода индекса за границы массива.
Пример использование самостоятельно.
К статическим методам обращаемся через имя класса (такие как Sort, IndexOf, BinarySearch).
Для того, чтобы получать значение элементов массивов любого типа в метод можно передавать параметр типа Array, а получать значение так :
Имя_параметра.GetValue(i).
Многомерные массивы. Размещение элементов многомерного массива в памяти
Существует несколько разновидностей многомерных массивов, а именно прямоугольные и ступенчатые.
Прямоугольные массивы
Прямоугольный массив имеет более одного измерения. Чаще всего в программах используются двумерные массивы. Варианты описания двумерного массива:
тип[,] имя;
тип[,] имя = new тип [ разм_1, разн_2 ] ;
тип[,] имя = { списокинициализаторов }:
тип[,] имя = new тип [,] { списокинициализаторов };
тип[,] иня = new тип [ рази_1, разн_2 ] { списокинициализаторов };
Примеры описаний (один пример для каждого варианта описания):
int[ , ] a; // 1
int[ , ] b = new int[2. 3]: 111
int[ , ] c = { {1. 2. 3} , {4. 5. 6} }; // 3
int [ , ] с = new int [ , ] {{1. 2. 3}. {4, 5. 6}}: // 4
int [ , ] d = new int[2,3] {{1. 2. 3}. {4, 5. 6}};// 5
Если список инициализации не задан, размерности могутбыть не только константами, но и выражениями типа, приводимого к целому. К элементу двумерного массива обращаются, указывая номера строки и столбца, на пересечении которых он расположен, например:
а[1 , 4] b[i, j] b[j , i]
Пример самостоятельно.
Ступенчатые массивы
В ступенчатых массивах количество элементов в разных строках может различаться.В памяти ступенчатый массив хранится иначе, чем прямоугольный: в виде нескольких внутренних массивов, каждый из которых имеет свой размер. Крометого, выделяется отдельная область памяти для хранения ссылок на каждый из внутренних массивов. Организацию ступенчатого массива иллюстрирует.
Описание ступенчатого массива:
тип[][] имя;
Под каждый из массивов, составляющих ступенчатый массив, память требуется выделять явным образом, например:
int [ ][ ] a = newint[3][ ];
а[0] = new int[5];
а[1] = new int[3];
a[2] = new int[4];
Здесь а[0],а[1]иа[2] — это отдельные массивы, к которым можно обращаться по имени. Другой способ выделенияпамяти:
int [ ][ ] а = { new int[5]. new int[3]. new int[4] };
К элементу ступенчатого массива обращаются, указывая каждую размерность в своих квадратных скобках, например:
а[1][2] a[i][j] a[j][i]
В остальном использование ступенчатых массивов не отличается от использования прямоугольных. Невыровненные массивы удобно применять, например, дляработы с треугольными матрицами большого объема.