1. Вступ
Що зазвичай хочеться робити з масивами?
Перелічімо базові операції:
- Читання та зміна елементів масиву за індексом.
- Пошук елемента за значенням.
- Копіювання масиву, створення «зрізів» (частин масиву).
- Сортування масиву.
- Реверс (розворот) масиву.
- Заповнення масиву значенням.
- Перевірка наявності елемента (чи містить масив задане значення).
- Зміна довжини (resize).
У реальних завданнях ви часто стикаєтеся з цими діями — наприклад, «чи є сума більша за 4 000?», «знайдіть першу ціну, меншу за 1 000», «відсортуйте ціни за зростанням» тощо.
І для всього цього маємо методи
| Операція | Метод / Синтаксис | Особливості |
|---|---|---|
| Зміна за індексом | |
Помилка, якщо індекс поза межами |
| Пошук значення | |
-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 — потрібне приведення типу:
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; для цих методів.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ