Доступ к элементам массива
Массивы и кортежи
• Простые массивы
• Многомерные массивы
• Зубчатые массивы
• Класс Array
• Массивы в качестве параметров
• Перечисления
• Кортежи
• Структурное сравнение
Для работы с множеством объектов одного и того же типа можно использовать коллекции (см. раздел 6.10) и массивы. В C# предусмотрена специальная нотация для объявления и использования массивов. Здесь “за кулисами” вступает в действие класс Array, предоставляющий несколько методов для сортировки и фильтрации-элементов внутри массива. С помощью перечислителя (enumerator) можно выполнить итерацию по всем элементам массива. Кроме того, в .NET 4 появился новый тип Tuple (кортеж), который может использоваться для комбинации множества объектов разного типа (см. подраздел “Кортежи” далее в этом разделе).
Простые массивы
При работе с множеством объектов одного и того же типа можно использовать массив. Массив - это структура данных, содержащая множество элементов одного и того же типа.
Объявление массива
Массив объявляется определением типа элементов, содержащихся в нем, за которым следуют квадратные скобки и имя переменной; например, массив, содержащий целочисленные элементы, объявляется так:
int[] myArray;
Инициализация массива
После объявления массива должна быть выделена память для хранения всех его элементов. Массив является ссылочным типом, поэтому память для него должна распределяться в куче. Это делается инициализацией переменной массива с помощью операции new с указанием типа и количества элементов в массиве. Вот как специфицируется размер массива:
myArray = new int [ 4 ] ;
После такого объявления и инициализации переменная myArray ссылается на четыре целочисленных значения, распределенные в управляемой куче (рис. 6.1).
После изначальной спецификации размер массива не может быть изменен без копирования всех элементов. Если заранее не известно, сколько элементов должно содержаться в массиве, следует использовать коллекцию. Коллекции рассматриваются в разделе 6.10.
Рисунок 6.1 - Переменная myArray ссылается на четыре целочисленных значения в управляемой куче
Объявлять и инициализировать массив можно также в одной строке, а не в нескольких: int[] myArray = new int[4];
Присвоить значения каждому элементу массива, можно с помощью инициализатора массива. Инициализаторы массивов могут использоваться прямо в объявлении переменной массива, а не после того, как массив объявлен:
int [] myArray = new int[4] {4, 7, 11, 2 };
Если вы инициализируете массив, применяя фигурные скобки, то размер массива можно не указывать, поскольку компилятор определит его самостоятельно:
int[] myArray = new int[] {4, 7, 11, 2};
При использовании компилятора C# существует еще более короткая форма. Написать объявление и инициализацию массива можно с помощью фигурных скобок. Код, сгенерированный компилятором в следующем случае, будет таким же, как и в предыдущем:
int[] myArray = {4, 7, 11, 2};
Доступ к элементам массива
После того, как массив объявлен и инициализирован, к его элементам можно обращаться с использованием индексатора (indexer). Массивы поддерживают только целочисленные индексаторы.
Индексатору передается номер элемента для доступа к массиву. Индексатор всегда начинается со значения 0 для первого элемента. Самый больший номер, который можно передать индексатору, равен общему количеству элементов в массиве минус 1, поскольку нумерация начинается с нуля. В следующем примере массив myArray объявляется и инициализируется четырьмя целыми значениями. К элементам можно обращаться со значениями индексатора 0, 1, 2 и 3.
int[] myArray = new int[] {4, 7, 11, 2};
int vl = myArray[0]; // читать первый элемент
int v2 = myArray[l]; // читать второй элемент
myArray [3] = 44; // изменить четвертый элемент
Если значению индексатора, не соответствует никакого элемента, генерируется исключение типа IndexOutOfRangeException.
Чтобы узнать количество элементов в массиве, можно воспользоваться свойством Length, как показано в приведенном ниже операторе:
for (int i = 0; i < myArray.Length; i++)
{
Console.WriteLine(myArray[i]);
}
Вместо применения оператора for для прохождения по всем элементам массива можно также использовать оператор foreach:
foreach (int val in myArray)
{
Console.WriteLine(val);
}
Оператор foreach использует интерфейсы IEnumerable и IEnumerator, о которых речь пойдет дальше в этом разделе.