Массивы в Си-шарп. Класс List
Массив – это набор однотипных данных, которые располагаются в памяти последовательно друг за другом. Доступ к элементам массива осуществляется по индексу (номеру) элемента. Массив может содержать элементы любого типа данных, можно даже создавать массив массивов (ступенчатый массив). Количество элементов в массиве называется размером массива. Массивы относятся к ссылочным типам данных.
Массивы в Си-шарп могут быть одномерными и многомерными.
Одномерные массивы
Одномерный массив по-другому еще называется вектором, и для доступа к его элементам используется только один индекс. Выглядит вектор примерно так:
В Си-шарп объявление массива имеет такую структуру:
тип[] имя_массива = new тип[размер массива];
Пример:
Если происходит инициализация, оператор new можно упускать:
Доступ к элементам осуществляется по индексу. Следует помнить, что индексация начинается с нуля – первый элемент массива имеет индекс 0, а последний n-1, где n – размер массива.
В качестве массива можно представить, например, список студентов в группе (имена), показатели температуры воздуха за последние несколько дней и так далее.
Многомерные массивы
Одним из случаев многомерного массива служит двумерный массив (матрица). В матрице для доступа к элементам необходимо использовать два индекса.
Количеством индексов, используемых для доступа к элементам массива называется размерность массива.
Элементу массива numbers1 с координатами 1,1 присвоим значение 8:
numbers1[1, 1] = 8;
Многомерные массивы используются гораздо реже одномерных.
Приведу немного бредовый пример данных, которые можно было бы представить в качестве двумерного массива:
Есть матрица 7*4. Строки, которых семь, будут соответствовать дням недели, а 4 столбца - времени дня (00:00, 06:00, 12:00, 18:00). В качестве данных будет температура воздуха.
Значение температуры с координатами 2,3 будет соответствовать температуре в среду в 18:00. На практике, конечно, такие данные представлялись бы в другом виде, но для примера подойдет.
Ступенчатые (jagged) массивы в Си-шарп
Ступенчатый (jagged) массив – это массив массивов. В нем длина каждого массива может быть разной. Примерно это выглядит так:
Пример объявления ступенчатого массива:
Доступ к элементам осуществляется по тому же принципу, как и с многомерными маcсивами, только тут уже участвуют две пары квадратных скобок (продолжение примера выше):
Свойство Length
Все массивы являются объектами и у них есть некоторые свойства.
Самым полезным для нас будет свойство Length, которое возвращает количество элементов в массиве (во всех размерностях)
Класс List
Класс List служит для работы со списками, о чем и говорит его название. Это такой «навороченный» массив. Главное отличие от простого массива в том, что он динамический – вы можете вставлять и удалять элементы в любое время, в то время как в простом массиве размер указывается при создании и сделать его больше или меньше нельзя.
Добавление элементов
Для добавления элементов в список в нем реализовано несколько методов:
Удаление элементов
Свойство Count соответствует свойству обычного массива – Length – количество элементов.
Стоит помнить, что простые массивы работают быстрее, чем списки List. Если в вашей программе не особо важна производительность и вы не работаете с большими количествами данных, то удобнее использовать список, в противном случае нужно использовать простые массивы.
Домашнее задание
Работать с массивами без использования циклов в большинстве случаев нет смысла. О циклах мы поговорим в следующем уроке. А так, пока можете создать разные типы массивов, записать что-то, вывести на экран некоторые элементы массива, попробуйте получить доступ до элемента вне рамок массива. Создайте список, попробуйте добавить элемент в конец списка, вставить элемент по индексу и так далее.
Массивы в Си-шарп могут быть одномерными и многомерными.
Одномерные массивы
Одномерный массив по-другому еще называется вектором, и для доступа к его элементам используется только один индекс. Выглядит вектор примерно так:
В Си-шарп объявление массива имеет такую структуру:
тип[] имя_массива = new тип[размер массива];
Пример:
int[] array = new int[5]; // создаем массив целых чисел
string[] seasons = new string[4] {"зима","весна","лето","осень"}; //объявление массива строк и его инициализация значениями
string[] seasons = new string[4] {"зима","весна","лето","осень"}; //объявление массива строк и его инициализация значениями
Если происходит инициализация, оператор new можно упускать:
string[] seasons = {"зима","весна","лето","осень"}; //корректно
Доступ к элементам осуществляется по индексу. Следует помнить, что индексация начинается с нуля – первый элемент массива имеет индекс 0, а последний n-1, где n – размер массива.
static void Main(string[] args)
{
int[] numbers = new int[5];
numbers[0] = 5;
numbers[1] = 2;
numbers[4] = 3;
numbers[5] = 2; // ошибка, индекс вне рамок массива
}
{
int[] numbers = new int[5];
numbers[0] = 5;
numbers[1] = 2;
numbers[4] = 3;
numbers[5] = 2; // ошибка, индекс вне рамок массива
}
В качестве массива можно представить, например, список студентов в группе (имена), показатели температуры воздуха за последние несколько дней и так далее.
Многомерные массивы
Одним из случаев многомерного массива служит двумерный массив (матрица). В матрице для доступа к элементам необходимо использовать два индекса.
Количеством индексов, используемых для доступа к элементам массива называется размерность массива.
int[,] numbers1 = new int[2, 2]; // объявление двумерного массива
int[,,] numbers2 = new int[2, 2 ,3]; // объявление трехмерного массива
int[,] numbers3 = new int[3, 2] { {6, 0},
{5, 7},
{8, 9} }; // инициализация двумерного массива
int[,,] numbers2 = new int[2, 2 ,3]; // объявление трехмерного массива
int[,] numbers3 = new int[3, 2] { {6, 0},
{5, 7},
{8, 9} }; // инициализация двумерного массива
Элементу массива numbers1 с координатами 1,1 присвоим значение 8:
numbers1[1, 1] = 8;
Многомерные массивы используются гораздо реже одномерных.
Приведу немного бредовый пример данных, которые можно было бы представить в качестве двумерного массива:
Есть матрица 7*4. Строки, которых семь, будут соответствовать дням недели, а 4 столбца - времени дня (00:00, 06:00, 12:00, 18:00). В качестве данных будет температура воздуха.
Значение температуры с координатами 2,3 будет соответствовать температуре в среду в 18:00. На практике, конечно, такие данные представлялись бы в другом виде, но для примера подойдет.
Ступенчатые (jagged) массивы в Си-шарп
Ступенчатый (jagged) массив – это массив массивов. В нем длина каждого массива может быть разной. Примерно это выглядит так:
Пример объявления ступенчатого массива:
static void Main(string[] args)
{
int[][] array = new int[3][]; // объявляем массив, который содержит 3 массива
array [0] = new int[3]; //создание внутреннего массива
array [1] = new int[2];
array [2] = new int[5];
}
{
int[][] array = new int[3][]; // объявляем массив, который содержит 3 массива
array [0] = new int[3]; //создание внутреннего массива
array [1] = new int[2];
array [2] = new int[5];
}
Доступ к элементам осуществляется по тому же принципу, как и с многомерными маcсивами, только тут уже участвуют две пары квадратных скобок (продолжение примера выше):
array [0][1] = 5;
array [1][1] = 8;
array [1][2] = 5; // ошибка, индекс «2» вне границ массива
array [1][1] = 8;
array [1][2] = 5; // ошибка, индекс «2» вне границ массива
Свойство Length
Все массивы являются объектами и у них есть некоторые свойства.
Самым полезным для нас будет свойство Length, которое возвращает количество элементов в массиве (во всех размерностях)
static void Main(string[] args)
{
int[] numbers = new int[5];
int size = numbers.Length; // size = 5
}
{
int[] numbers = new int[5];
int size = numbers.Length; // size = 5
}
Класс List
Класс List служит для работы со списками, о чем и говорит его название. Это такой «навороченный» массив. Главное отличие от простого массива в том, что он динамический – вы можете вставлять и удалять элементы в любое время, в то время как в простом массиве размер указывается при создании и сделать его больше или меньше нельзя.
static void Main(string[] args)
{
List<string> teams = new List<string>(); // создание списка
teams.Add("Barcelona"); // добавление элемента
teams.Add("Chelsea");
teams.Add("Arsenal");
List<string> teams2 = new List<string>() {"Dynamo", "CSKA" }; // инициализация
}
{
List<string> teams = new List<string>(); // создание списка
teams.Add("Barcelona"); // добавление элемента
teams.Add("Chelsea");
teams.Add("Arsenal");
List<string> teams2 = new List<string>() {"Dynamo", "CSKA" }; // инициализация
}
Добавление элементов
Для добавления элементов в список в нем реализовано несколько методов:
Метод | Описание |
---|---|
Add([элемент]) | добавляет элемент в конец списка |
AddRange([список элементов]) | добавляет в конец списка элементы указанного списка |
Insert([индекс],[элемент]) | вставляет элемент на позицию соответствующую индексу, все элементы «правее» будут сдвинуты на одну позицию |
InsertRange([индекс], [список элементов]) | то же самое, только вставляется множество элементов |
Удаление элементов
Метод | Описание |
---|---|
Remove([элемент]) | удаляет первое вхождение указанного элемента из списка |
RemoveRange([индекс], [количество]) | удаляет указанное количество элементов, начиная с указанной позиции |
RemoveAt([индекс]) | удаляет элемент, который находится на указанной позиции |
Clear() | удаляет все элементы списка |
Свойство Count соответствует свойству обычного массива – Length – количество элементов.
static void Main(string[] args)
{
List<string> teams = new List<string>() { "Inter", "Milan", "Bayern", "Juventus"};
teams.Insert(2,"Barcelona"); // вставляем в список элемент "Barcelona" на позицию 2
teams.Remove("Milan"); // удаляем первое вхождение элемента "Milan" из списка
List<string> newTeams = new List<string>() { "Liverpool", "Roma", "Borussia", "Valencia" };
teams.AddRange(newTeams); // добавляем в конец списка элементы списка newTeams
}
{
List<string> teams = new List<string>() { "Inter", "Milan", "Bayern", "Juventus"};
teams.Insert(2,"Barcelona"); // вставляем в список элемент "Barcelona" на позицию 2
teams.Remove("Milan"); // удаляем первое вхождение элемента "Milan" из списка
List<string> newTeams = new List<string>() { "Liverpool", "Roma", "Borussia", "Valencia" };
teams.AddRange(newTeams); // добавляем в конец списка элементы списка newTeams
}
Стоит помнить, что простые массивы работают быстрее, чем списки List. Если в вашей программе не особо важна производительность и вы не работаете с большими количествами данных, то удобнее использовать список, в противном случае нужно использовать простые массивы.
Домашнее задание
Работать с массивами без использования циклов в большинстве случаев нет смысла. О циклах мы поговорим в следующем уроке. А так, пока можете создать разные типы массивов, записать что-то, вывести на экран некоторые элементы массива, попробуйте получить доступ до элемента вне рамок массива. Создайте список, попробуйте добавить элемент в конец списка, вставить элемент по индексу и так далее.