JavaRush /Курсы /C# SELF /Основные операции над одномерными массивами

Основные операции над одномерными массивами

C# SELF
7 уровень , 3 лекция
Открыта

1. Введение

Что обычно хочется делать с массивами?

Давайте перечислим базовые операции:

  • Чтение и изменение элементов массива по индексу.
  • Поиск элемента по значению.
  • Копирование массива, создание “срезов” (часть массива).
  • Сортировка массива.
  • Реверс (разворот) массива.
  • Заполнение массива значением.
  • Проверка наличия элемента (содержит ли массив заданное значение).
  • Изменение длины (resize).

В реальных задачах вы часто сталкиваетесь с этими действиями — например, «есть ли сумма выше 4000?», «найди первую цену ниже 1000», «отсортируй цены по возрастанию» и так далее.

И для всего этого у нас есть функции

Операция Метод / Синтаксис Особенности
Изменение по индексу
arr[n] = x
Ошибка, если вне границ
Поиск значения
Array.IndexOf(arr, v)
-1, если не найден
Проверка наличия
Array.Exists(arr, pred)
Лямбда или функция
Сортировка
Array.Sort(arr)
Массив меняется на месте
Реверс
Array.Reverse(arr)
Меняет порядок элементов
Копирование
arr.Clone(), Array.Copy
Поверхностное копирование
Заполнение
Array.Fill(arr, val)
Заполняет одним значением
Изменение размера
Array.Resize(ref arr, len)
Новые элементы — default
Поиск максимума/минимума
arr.Max(), arr.Min()
Требует 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.IndexOf

Функция 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);
}
Поиск всех вхождений элемента с конца с помощью Array.LastIndexOf

4. Проверка наличия элемента в массиве

Для проверки наличия элемента есть функция Contains. Этот метод возвращает true, если массив содержит указанный элемент. Для её работы нужно обязательно подключить модуль System.Linq. Пример:

using System.Linq; // Подключите using System.Linq; если нет

bool hasExcellent = grades.Contains(5); 
Console.WriteLine($"Есть ли пятерка? {hasExcellent}");
Проверка наличия значения в массиве с помощью Contains

Всё очень просто и красиво.

5. Реверсировать массив: Array.Reverse

Допустим, вы хотите развернуть массив “задом наперёд”. Используйте:

int[] grades = { 2, 3, 4, 5 };

// Разворачиваем массив
Array.Reverse(grades);
Console.WriteLine("Реверсивные оценки: " + string.Join(", ", grades));
Разворот массива с помощью Array.Reverse

Это очень удобно для поиска “самых свежих” данных или просто если вы любите смотреть на мир вверх ногами.

6. Сортировка массива: Array.Sort

Рано или поздно вам захочется отсортировать массив. Самый короткий и безопасный путь — использовать стандартную функцию сортировки:

int[] grades = { 4, 3, 5, 2, 5 };
// Сортируем по возрастанию
Array.Sort(grades);
Console.WriteLine("Отсортированные оценки: " + string.Join(", ", grades));
Сортировка массива по возрастанию с помощью Array.Sort

Эта функция сортирует и строки, но в алфавитном порядке.

Сортировка по убыванию

Стандартный Array.Sort сортирует только по возрастанию. Для сортировки по убыванию можно воспользоваться сортировкой + реверсом:

Array.Sort(grades); // Сначала по возрастанию
Array.Reverse(grades); // Затем разворачиваем
Console.WriteLine("По убыванию: " + string.Join(", ", grades));
Сортировка по убыванию: Sort + Reverse

Примечание: довольно часто забывают, что сортировка происходит “на месте”: массив изменяется, возврата нового не происходит. Если необходим исходный порядок, сперва скопируйте исходный массив.

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);
Клонирование массива: Clone() и Array.Copy()

Важная особенность: массивы копируются по значению, если это примитивные типы (int, double). Если это массив объектов, копируются только ссылки! (т.н. “поверхностное копирование”).

8. Заполнение массива значением: Array.Fill

Хотите “обнулить” массив или заполнить его всем пятёрками? Для этого есть удобный метод — Array.Fill:

int[] grades = new int[5];
Array.Fill(grades, 5); // Теперь все элементы равны 5
Console.WriteLine("Гипотетически идеальный студент: " + string.Join(", ", grades));
Заполнение массива значением с помощью Array.Fill

Полезно, когда требуется быстро проинициализировать массив определённым значением.

9. Поиск максимального и минимального значения

Модуль System.Linq добавил массивам много полезных методов, и два таких возвращают минимальное и максимальное значение в массиве. Называются они Max() и Min().

Давайте найдём максимальную или минимальную оценку в массиве:

int maxGrade = grades.Max();
int minGrade = grades.Min();
Console.WriteLine($"Максимальная оценка: {maxGrade}, минимальная: {minGrade}");
Поиск максимального и минимального значения в массиве

Не забудьте добавить using System.Linq; для этих методов.

2
Задача
C# SELF, 7 уровень, 3 лекция
Недоступна
Сортировка массива и нахождение максимального элемента
Сортировка массива и нахождение максимального элемента
2
Задача
C# SELF, 7 уровень, 3 лекция
Недоступна
Поиск всех вхождений элемента в массиве
Поиск всех вхождений элемента в массиве
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Yurii N Уровень 32
26 декабря 2025
Поры бы уже исправить, это корректная форма записи: int[] array = [9, 3, 7, 2, 8, 6, 4];
Ra Уровень 35 Student
4 сентября 2025
Валидатор не принимает такие клёвые collection expressions, хочет старый формат new int[] {} если что
Илья Уровень 9
1 августа 2025
"Метод `Max` используется правильно, но его результат необходимо сохранить в переменную и затем вывести, чтобы соответствовать формату вывода." Хотя явно в задании не упоминается, что обязательно сохранение в переменную