Сортировка и поиск
С рядом шкафчиков обычно делают одно из двух:
- раскладывают вещи по порядку;
- ищут нужную вещь.
С массивами то же самое: баллы учеников сортируют, чтобы увидеть лучший и худший результат, а в массиве номеров ищут, есть ли там нужный и под каким он индексом. Для массива оба действия можно написать циклом. Но в .NET для них есть готовые методы, и такой цикл писать не нужно.
Сортировка
Метод Array.Sort расставляет элементы массива по возрастанию, а Array.Reverse переворачивает массив:
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Давайте разберём по строкам:
Array.Sort(nums)переставляет элементы так, что они идут по возрастанию:1, 2, 5, 9.Array.Reverse(nums)меняет порядок на обратный: первый элемент становится последним. После сортировки это даёт порядок по убыванию.
Оба метода работают с тем же массивом: перекладывают вещи между шкафчиками того же ряда и ничего не возвращают. Нового массива они не создают, и прежний порядок пропадает. Если у массива два имени, отсортированный порядок видно через оба.
На собеседовании иногда спрашивают, создаёт ли Array.Sort новый массив. Нет: он сортирует тот массив, который ему передали.
Поиск
Метод Array.IndexOf ищет значение и возвращает индекс элемента:
int[] nums = [9, 5, 2, 5];
Console.WriteLine(Array.IndexOf(nums, 5)); // 1
Console.WriteLine(Array.IndexOf(nums, 7)); // -1Array.IndexOf(nums, 5) проверяет элементы от начала массива и возвращает индекс первого, равного 5. Пятёрок две, и находится первая, с индексом 1.
Array.IndexOf(nums, 7) проверяет все четыре элемента и семёрки не находит. Если значения в массиве нет, метод возвращает -1. Индекса -1 не бывает, поэтому этот ответ не спутать с индексом найденного элемента. Перед тем как читать элемент по результату IndexOf, проверьте, что результат не равен -1.
Частая ошибка
Результат Array.Sort попытались положить в новую переменную:
int[] nums = [5, 2, 9, 1];
int[] sorted = Array.Sort(nums); // ✗error CS0029: Cannot implicitly convert type 'void' to 'int[]'Программа не компилируется. Array.Sort ничего не возвращает: в сообщении это void, как у методов без результата. Он сортирует сам массив nums, поэтому его вызывают отдельной инструкцией, а потом читают nums. Если прежний порядок тоже нужен, сначала сделайте настоящую копию через новый массив и Array.Copy, а потом отсортируйте её.
Главное
Array.SortиArray.Reverseпереставляют элементы в том же массиве и ничего не возвращают.Array.IndexOfвозвращает индекс первого подходящего элемента или-1, если такого нет.