Перейти к содержимому
Теория · Массивы · урок 6 из 9

Сортировка и поиск

С рядом шкафчиков обычно делают одно из двух:

  • раскладывают вещи по порядку;
  • ищут нужную вещь.

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

Сортировка

Метод Array.Sort расставляет элементы массива по возрастанию, а Array.Reverse переворачивает массив:

C#
int[] nums = [5, 2, 9, 1];
Array.Sort(nums);
Console.WriteLine(string.Join(", ", nums)); // 1, 2, 5, 9
Array.Reverse(nums);
Console.WriteLine(string.Join(", ", nums)); // 9, 5, 2, 1

Давайте разберём по строкам:

  1. Array.Sort(nums) переставляет элементы так, что они идут по возрастанию: 1, 2, 5, 9.
  2. Array.Reverse(nums) меняет порядок на обратный: первый элемент становится последним. После сортировки это даёт порядок по убыванию.

Оба метода работают с тем же массивом: перекладывают вещи между шкафчиками того же ряда и ничего не возвращают. Нового массива они не создают, и прежний порядок пропадает. Если у массива два имени, отсортированный порядок видно через оба.

На собеседовании иногда спрашивают, создаёт ли Array.Sort новый массив. Нет: он сортирует тот массив, который ему передали.

Поиск

Метод Array.IndexOf ищет значение и возвращает индекс элемента:

C#
int[] nums = [9, 5, 2, 5];
Console.WriteLine(Array.IndexOf(nums, 5)); // 1
Console.WriteLine(Array.IndexOf(nums, 7)); // -1

Array.IndexOf(nums, 5) проверяет элементы от начала массива и возвращает индекс первого, равного 5. Пятёрок две, и находится первая, с индексом 1.

Array.IndexOf(nums, 7) проверяет все четыре элемента и семёрки не находит. Если значения в массиве нет, метод возвращает -1. Индекса -1 не бывает, поэтому этот ответ не спутать с индексом найденного элемента. Перед тем как читать элемент по результату IndexOf, проверьте, что результат не равен -1.

Частая ошибка

Результат Array.Sort попытались положить в новую переменную:

C#
int[] nums = [5, 2, 9, 1];
int[] sorted = Array.Sort(nums); // ✗
TEXT
error CS0029: Cannot implicitly convert type 'void' to 'int[]'

Программа не компилируется. Array.Sort ничего не возвращает: в сообщении это void, как у методов без результата. Он сортирует сам массив nums, поэтому его вызывают отдельной инструкцией, а потом читают nums. Если прежний порядок тоже нужен, сначала сделайте настоящую копию через новый массив и Array.Copy, а потом отсортируйте её.

Главное

  • Array.Sort и Array.Reverse переставляют элементы в том же массиве и ничего не возвращают.
  • Array.IndexOf возвращает индекс первого подходящего элемента или -1, если такого нет.