1. Введение
Что обычно хочется делать с массивами?
Давайте перечислим базовые операции:
- Чтение и изменение элементов массива по индексу.
- Поиск элемента по значению.
- Копирование массива, создание “срезов” (часть массива).
- Сортировка массива.
- Реверс (разворот) массива.
- Заполнение массива значением.
- Проверка наличия элемента (содержит ли массив заданное значение).
- Изменение длины (resize).
В реальных задачах вы часто сталкиваетесь с этими действиями — например, «есть ли сумма выше 4000?», «найди первую цену ниже 1000», «отсортируй цены по возрастанию» и так далее.
И для всего этого у нас есть функции
| Операция | Метод / Синтаксис | Особенности |
|---|---|---|
| Изменение по индексу | |
Ошибка, если вне границ |
| Поиск значения | |
-1, если не найден |
| Проверка наличия | |
Лямбда или функция |
| Сортировка | |
Массив меняется на месте |
| Реверс | |
Меняет порядок элементов |
| Копирование | |
Поверхностное копирование |
| Заполнение | |
Заполняет одним значением |
| Изменение размера | |
Новые элементы — default |
| Поиск максимума/минимума | |
Требует Linq |
2. Чтение и изменение элементов по индексу
С этим мы уже знакомы, но давайте ещё раз закрепим на простом примере (пусть у нас есть массив оценок):
// Массив оценок студента
int[] grades = { 4, 3, 5, 2, 5 };
// Прочитать первую оценку
int firstGrade = grades[0];
Console.WriteLine($"Первая оценка: {firstGrade}");
// Изменить последнюю оценку на "отлично" (5)
grades[^1] = 5;
Console.WriteLine("Измененная последняя оценка: " + grades[^1]);
Что тут важно: индексация с нуля, попытка обратиться к несуществующему индексу приводит к ошибке IndexOutOfRangeException — классика жанра на собеседованиях и в жизни.
3. Поиск элемента в массиве
У нас есть две функции, которые ищут элемент в массиве, и возвращают его индекс, если нашли.
Функция Array.IndexOf(value [, from])
Функция Array.IndexOf ищет заданный элемент с начала массива. Если она его нашла, то возвращает его индекс. Если нет — возвращает -1.
Но что делать, если вы хотите найти следующие вхождения нужного элемента в массив? Для этого в функцию Array.IndexOf нужно передать второй параметр — индекс, с которого она начнет искать. Это должен быть индекс последнего найденного элемента + 1.
Давайте найдем все вхождения числа 2 в наш массив:
int[] grades = { 4, 3, 5, 2, 5, 2 };
int x = 2; // элемент, который ищем
int index = Array.IndexOf(grades, x);
while (index != -1)
{
Console.WriteLine($"Элемент {x} найден на позиции: {index}");
// Ищем следующий индекс, начиная с позиции index + 1
index = Array.IndexOf(grades, x, index + 1);
}
Функция Array.LastIndexOf(value [, from])
Функция Array.LastIndexOf ищет заданный элемент с конца массива. Если она его нашла, то возвращает его индекс. Если нет — возвращает -1. В остальном она полностью аналогична функции Array.IndexOf.
Давайте найдем все вхождения числа 2 в наш массив, но искать будем с конца:
int[] grades = { 4, 3, 5, 2, 5, 2 };
int x = 2; // элемент, который ищем
int index = Array.LastIndexOf(grades, x);
while (index != -1)
{
Console.WriteLine($"Элемент {x} найден на позиции: {index}");
// Ищем следующий индекс, начиная с предыдущей позиции - 1
index = Array.LastIndexOf(grades, x, index - 1);
}
4. Проверка наличия элемента в массиве
Для проверки наличия элемента есть функция Contains. Этот метод возвращает true, если массив содержит указанный элемент. Для её работы нужно обязательно подключить модуль System.Linq. Пример:
using System.Linq; // Подключите using System.Linq; если нет
bool hasExcellent = grades.Contains(5);
Console.WriteLine($"Есть ли пятерка? {hasExcellent}");
Всё очень просто и красиво.
5. Реверсировать массив: Array.Reverse
Допустим, вы хотите развернуть массив “задом наперёд”. Используйте:
int[] grades = { 2, 3, 4, 5 };
// Разворачиваем массив
Array.Reverse(grades);
Console.WriteLine("Реверсивные оценки: " + string.Join(", ", grades));
Это очень удобно для поиска “самых свежих” данных или просто если вы любите смотреть на мир вверх ногами.
6. Сортировка массива: Array.Sort
Рано или поздно вам захочется отсортировать массив. Самый короткий и безопасный путь — использовать стандартную функцию сортировки:
int[] grades = { 4, 3, 5, 2, 5 };
// Сортируем по возрастанию
Array.Sort(grades);
Console.WriteLine("Отсортированные оценки: " + string.Join(", ", grades));
Эта функция сортирует и строки, но в алфавитном порядке.
Сортировка по убыванию
Стандартный Array.Sort сортирует только по возрастанию. Для сортировки по убыванию можно воспользоваться сортировкой + реверсом:
Array.Sort(grades); // Сначала по возрастанию
Array.Reverse(grades); // Затем разворачиваем
Console.WriteLine("По убыванию: " + string.Join(", ", grades));
Примечание: довольно часто забывают, что сортировка происходит “на месте”: массив изменяется, возврата нового не происходит. Если необходим исходный порядок, сперва скопируйте исходный массив.
7. Клонирование массива: Clone и Array.Copy
Если нужно создать копию (и не портить исходный массив при обработке), пользуйтесь методами Clone() и Array.Copy().
Метод Clone() нужно вызвать у массива, и он вернет его полную копию.
Метод Array.Copy() требует, чтобы в него передали данные:
- массив-источник;
- массив, куда копировать данные;
- сколько копировать ячеек.
int[] original = { 1, 2, 3, 4, 5 };
// Способ 1: Clone()
// Работает для одномерных и многомерных массивов, но возвращает object, нужен type cast:
int[] copy1 = (int[]) original.Clone();
// Способ 2: Array.Copy
int[] copy2 = new int[original.Length];
Array.Copy(original, copy2, original.Length);
Важная особенность: массивы копируются по значению, если это примитивные типы (int, double). Если это массив объектов, копируются только ссылки! (т.н. “поверхностное копирование”).
8. Заполнение массива значением: Array.Fill
Хотите “обнулить” массив или заполнить его всем пятёрками? Для этого есть удобный метод — Array.Fill:
int[] grades = new int[5];
Array.Fill(grades, 5); // Теперь все элементы равны 5
Console.WriteLine("Гипотетически идеальный студент: " + string.Join(", ", grades));
Полезно, когда требуется быстро проинициализировать массив определённым значением.
9. Поиск максимального и минимального значения
Модуль System.Linq добавил массивам много полезных методов, и два таких возвращают минимальное и максимальное значение в массиве. Называются они Max() и Min().
Давайте найдём максимальную или минимальную оценку в массиве:
int maxGrade = grades.Max();
int minGrade = grades.Min();
Console.WriteLine($"Максимальная оценка: {maxGrade}, минимальная: {minGrade}");
Не забудьте добавить using System.Linq; для этих методов.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ