Урок 26. Массивы C#


Двадцать шестая часть учебника по основам C# расширяет наши знания о типах данных. В нашем учебнике рассмотрено множество типов данных, в каждом из которых хранится одно значение. А в данной статье рассматривается использование массивов для хранения многих значений в простой структуре.

Что такое массив?

До сих пор в учебнике мы сосредоточились на основных типах данных. В каждом случае тип данных хранит одно значение. Часто необходимо сгруппировать связанные значения, представляющие ряд данных, табличные данные или более сложные структуры. Один из способов достижения этого - создание массива.

Массив-это набор переменных с общим типом данных. Тип данных может быть любым типом, поддерживаемым платформой .NET framework, включая строки, числовые типы и объекты. Элементы массива отличаются друг от друга одним или несколькими индексными номерами. Это позволяет легко контролировать связанные значения.

.NET framework реализует массивы как объекты. Это не означает, что отдельные элементы должны быть объектами, но это влияет на способы управления массивами. Например, массивы создаются с помощью ключевого слова new. Массив также может быть оставлен неинициализированным со значением null.

Простое объявление массива

Наиболее основным типом массива является одномерный массив. Он предоставляет простой список значений. Метод, используемый для объявления массива, похож на метод любой другой переменной. Однако за типом данных в объявлении следует пара квадратных скобок. В следующем примере создается массив целых чисел.

int[] listItems;
Объявленный таким образом массив содержит null. Мы можем инициализировать массив, используя ключевое слово new и указывая количество элементов, которые нам требуются в списке:

listItems = new int[10];
Как и в предыдущих объявлениях, два элемента могут быть объединены в один оператор:

int[] listItems = new int[10];
Нумерация индексов

C# всегда начинает нумерацию индекса массива с нулевого элемента. Индекс увеличивается с каждым последующим элементом. В приведенном выше примере массив включает десять элементов, пронумерованных от нуля до девяти. Каждую можно использовать в качестве отдельной переменной, указав имя переменной, за которым следует номер индекса в квадратных скобках. Границы массивов строго соблюдаются. Любая попытка чтения или изменения значения вне объявленного диапазона вызывает исключение.

int[] listItems = new int[3];
 
listItems[0] = 25;
listItems[1] = listItems[0] * 2;    // listItem[1] = 50
listItems[2] = listItems[1] * 2;    // listItem[2] = 100
listItems[3] = listItems[2] * 2;    // ошибка
Инициализация массива

Как показано, к каждому элементу массива можно обращаться индивидуально. Это может быть утомительно при заполнении массива набором значений и требует чрезмерного количества кода. C# предоставляет способ инициализации всех переменных массива в одном операторе. Список значений, разделенных запятыми, предоставляется в скобках и присваивается объявлению. Размер массива устанавливается автоматически.

int[] listItems = new int[] {2,4,8};
Получение длины массива

Возможно, размер обрабатываемого массива неизвестен. Чтобы убедиться, что границы массива не превышены во время обработки, можно получить длину массива с помощью свойства Length. При чтении свойства массива квадратные скобки опскаются.

int[] listItems = new int[] {2,4,8};
 
int length = listItems.Length;         // length = 3
Двумерные массивы

Простой тип массива" list", описанный выше, является одномерным массивом; единственное измерение указывается с помощью индекса. Для более сложных структур можно создавать массивы с несколькими измерениями. Например, двумерный массив может содержать таблицу значений. В следующем примере мы создадим массив, содержащий следующую таблицу строковых значений. Пронумерованные строки и столбцы указывают номера индексов для каждого измерения:



Первое измерение массива будет указывать номера строк, а второе измерение - столбцы. Для объявления такого массива границы измерений разделяются запятыми в квадратных скобках. Та же нотация используется для доступа к отдельным переменным.

string[,] table = new string[3,4];
 
table[0,0] = "Apple";
table[0,1] = "Banana";
table[0,2] = "Clementine";
table[0,3] = "Damson";
table[1,0] = "Elderberry";
table[1,1] = "Fig";
 
Инициализация двумерного массива

При использовании табличных данных для инициализации переменных массива может потребоваться много строк кода. Опять же, метод инициализации доступен для минимизации кодирования. Каждая строка таблицы инициализируется списком значений, разделенных запятыми в фигурных скобках. Строки также разделены запятыми и окружены дополнительной парой скобок. Следующий пример показывает это в действии, инициализируя всю таблицу из предыдущего раздела.

string[,] table = new string[,]
{
    {"Apple", "Banana", "Clementine", "Damson"},
    {"Elderberry", "Fig", "Grape", "Huckleberry"},
    {"Indian Prune", "Jujube", "Kiwi", "Lime"}
};
 
string fruit = table[1,3];              // fruit = "Huckleberry"
Многомерный массив

Массивы могут содержать любое количество измерений. Чтобы добавить дополнительные измерения, в объявление можно включить дополнительные запятые и диапазоны. Инициализация массива становится более сложной с дальнейшими вложенными, разделенными запятыми списками списков. Однако при использовании таких сложных структур они обычно инициализируются программно, возможно, с использованием информации из базы данных.

int [,,] cube = новый int[5, 4, 10];
int [,,,,] пятимерный = новый int[5, 4, 10, 20, 6];
Получение размера многомерного массива

Размер многомерного массива можно запросить двумя способами. Свойство Length возвращает количество отдельных переменных всего массива. Это равно произведению размеров каждого измерения.

int[,,] cube = new int[5,4,10];
 
int length = cube.Length;               // length = 200
Длина многомерного массива может быть полезным числом. Однако это не говорит нам всего, что мы можем хотеть знать о массиве. Возможно, нам потребуется определить количество измерений, содержащихся в массиве, и длину каждого измерения. Свойство Rank возвращает целое число, содержащее первое. Для последнего используется свойство GetLength с аргументом, указывающим номер измерения для запроса.

int[,,] cube = new int[5,4,10];
 
int dimensions = cube.Rank;             // dimensions = 3
int length0 = cube.GetLength(0);        // length0 = 5
int length1 = cube.GetLength(1);        // length1 = 4
int length2 = cube.GetLength(2);        // length2 = 10
Массив массивов

Ранее в статье для хранения таблицы данных использовался двумерный массив. Этот тип массива также известен как прямоугольный, поскольку он генерирует прямоугольную таблицу. Иногда полезно создать двумерный массив со строками различной длины. Рассмотрим следующую таблицу:



Эта таблица содержит три строки, но каждая содержит разное количество столбцов. C# можно представить как массив массивов. Массив массивов (Jagged array) - это вложенный массив массивов, объявленный с использованием двух пар квадратных скобок, а не одной пары с двумя размерами измерений. В первоначальном объявлении указывается только количество строк; отдельные строки имеют размер или инициализируются индивидуально.

string[][] table = new string[3][];         // Объявляем основной массив

// Объявляем подмассивы

table[0] = new string[] {"Apple", "Banana", "Clementine"};
table[1] = new string[] {"Cabbage", "Lettuce", "Onion", "Potato"};
table[2] = new string[] {"Cheese", "Milk"};
 
// Тестируем
string fruit = table[0][2];             // fruit = "Clementine"
string dairy = table[2][1];             // dairy = "Milk"
Назначение и копирование массивов

Все объекты, включая массивы являются ссылочными типами. Это означает, что данные в объекте хранится в памяти компьютера и переменная содержит указатель на эту память. Если одна переменная объекта назначена другой, дублируется только указатель на местоположение памяти; обе переменные фактически указывают на одни и те же данные. Таким образом, изменение значений одного объекта отражается на другом объекте.

Это можно продемонстрировать, присвоив один массив другому. Изменение любого из элементов любого массива отображается в обоих:

int[] primary = new int[] {2,4,8};
int[] secondary = primary;
int value = primary[1];                 // value = 4
 
secondary[1] = 99;
value = primary[1];                     // value = 99
Важно понимать эффект назначения ссылочных типов, поскольку ошибочное изменение одного экземпляра может неожиданно вызвать проблемы в другом месте.

Клонирование массивов

Часто необходимо создать копию массива, которой можно манипулировать, не повреждая содержимое оригинала. Для этого класса массива включает в себя метод Clone. Вместо того, чтобы назначать простую ссылку, это создает совершенно новую копию массива. Метод Clone возвращает объект, но конкретный тип массива не указан, поэтому этот объект должен быть приведен к правильному типу для назначения.

int[] primary = new int[] {2,4,8};
 
// Клонируем массив во вторичный массив, соответствующим образом

int[] secondary = (int[])primary.Clone(); 
// Получение значения из первичного массива

int value = primary[1];                 // value = 4 
// Изменим значение во вторичном массиве и перечитаем первичный массив

secondary[1] = 99;
value = primary[1];                     // value = 4
value = secondary[1];                   // value = 99
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, Уроки по си шарп, массивы, си шарп




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Урок 19. Наследование и конструкторы C#
Плавающий блок на сайт
Как оптимизировать MySQL запросы?