Інтерфейси IEnumerable та IEnumerator дозволяють створювати об’єкти, по яких можна проходити у циклі foreach.Вони є основою всіх колекцій у .NET.
IDisposable використовується для звільнення невикористовуваних ресурсів,наприклад, закриття файлів, з’єднань з базами даних, вивільнення пам’яті чи дескрипторів.
GetEnumerator(), який повертає об'єкт IEnumerator.Current та методи MoveNext() і Reset() для послідовного доступу до елементів.IEnumerable, може використовуватися в foreach, LINQ та інших механізмах перебирання елементів.
using System;
using System.Collections;
class MyCollection : IEnumerable
{
private string[] items = { "Один", "Два", "Три" };
public IEnumerator GetEnumerator()
{
return new MyEnumerator(items);
}
}
class MyEnumerator : IEnumerator
{
private string[] _items;
private int position = -1;
public MyEnumerator(string[] items)
{
_items = items;
}
public object Current
{
get { return _items[position]; }
}
public bool MoveNext()
{
position++;
return (position < _items.Length);
}
public void Reset()
{
position = -1;
}
}
class Program
{
static void Main()
{
MyCollection collection = new MyCollection();
foreach (var item in collection)
{
Console.WriteLine(item);
}
}
}
| Крок | Дія | Вивід у консоль |
|---|---|---|
| 1 | Створення колекції MyCollection |
(Немає виводу) |
| 2 | Запуск foreach |
Один Два Три |
Інтерфейси IEnumerable та IEnumerator — це базові механізми ітерації у C#. Власні колекції, які їх реалізують, можуть інтегруватися з усіма інструментами, що працюють з переліками даних.
Інтерфейс IDisposable використовується для звільнення невикористовуваних ресурсів,
наприклад, закриття файлів, з’єднань з базами даних, вивільнення пам’яті чи дескрипторів.
void Dispose() — викликається для очищення ресурсів.
using System;
using System.IO;
class FileWriter : IDisposable
{
private StreamWriter writer;
public FileWriter(string path)
{
writer = new StreamWriter(path);
Console.WriteLine("Файл відкрито для запису.");
}
public void WriteLine(string text)
{
writer.WriteLine(text);
}
public void Dispose()
{
if (writer != null)
{
writer.Close();
writer.Dispose();
Console.WriteLine("Файл закрито та ресурси звільнено.");
}
}
}
class Program
{
static void Main()
{
using (FileWriter fw = new FileWriter("test.txt"))
{
fw.WriteLine("Перша стрічка");
fw.WriteLine("Друга стрічка");
} // Тут автоматично викликається Dispose()
}
}
using
Оператор using гарантує, що метод Dispose() буде викликано автоматично після завершення блоку коду, навіть якщо виникла помилка.
using (FileWriter fw = new FileWriter("data.txt"))
{
fw.WriteLine("Hello, world!");
}
| Крок | Дія | Вивід у консоль |
|---|---|---|
| 1 | Створення об'єкта FileWriter |
Файл відкрито для запису. |
| 2 | Запис кількох рядків | (Немає виводу у консоль) |
| 3 | Вихід з блоку using |
Файл закрито та ресурси звільнено. |
Інтерфейс IDisposable — ключовий інструмент у керуванні ресурсами.
У поєднанні з using він дозволяє писати безпечний код, який автоматично звільняє ресурси,
зменшуючи ризик витоків пам’яті та блокування файлів.
Використовувати класи зі свого варіанту № 5_9 (створення інтерфейсу користувача). Сортування виконувати за зростанням значень.
Випадково створити масив об'єктів класу Child1 (морський транспорт). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти по полю «Швидкість». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Випадково створити масив об'єктів класу Child2 (наземний транспорт). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти по полю «Вартість». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Результат:

Випадково створити масив об'єктів класу Child1 (журнал). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти по полю "Ціна". Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Випадково створити масив об'єктів класу Child2 (книга). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти по полю «Кількість сторінок». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Результат:

Випадково створити масив об'єктів класу Child1 (лінійна функція) і значення Х. Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти за полем «Значення функції у точці Х». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Випадково створити масив об'єктів класу Child2 (квадратична функція) і значення Х. Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти за полем «Значення функції у точці Х». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Результат:

Випадково створити масив об'єктів класу Child1 (лінійне рівняння). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти по полю "Коефіцієнт при Х". Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Випадково створити масив об'єктів класу Child2 (квадратне рівняння). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти за полем «Коефіцієнт при Х2». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Результат:

Випадково створити масив об'єктів класу Child1 (допомога з інвалідності). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Сортувати за полем Група інвалідності. Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Випадково створити масив об'єктів класу Child2 (допомога багатодітним). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти по полю «Величина допомоги». Ще раз застосувати до кожного об'єкта методи класу вивести елементи масиву на екран.
Результат:
Випадково створити масив об'єктів класу Child1 (податки з фізичних осіб). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Сортування об'єктів по полю «Доход». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Випадково створити масив об'єктів класу Child2 (податки з юридичних осіб). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Сортування об'єктів по полю «Величина податку». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Результат:

Випадково створити масив об'єктів класу Child1 (арифметична прогресія). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти по полю «Різниця». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Випадково створити масив об'єктів класу Child2 (геометрична прогресія). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Сортувати за полем «Сума n членів». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Результат:

Випадково створити масив об'єктів класу Child1 (тетраедр). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти по полю "Ребро". Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Випадково створити масив об'єктів класу Child2 (куб). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти за полем «Площа повної поверхні». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Результат:

Випадково створити масив об'єктів класу Child1 (паралелепіпед). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти за полем «об'єм». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Випадково створити масив об'єктів класу Child2 (конус). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти по полю Висота конуса. Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Результат:

Випадково створити масив об'єктів класу Child1 (пасажирський літак). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти за полем «Вартість». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Випадково створити масив об'єктів класу Child2 (винищувач). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти по полю «Швидкість». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Результат:

Випадково створити масив об'єктів класу Child2 (працівник з погодинною оплатою). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти по полю «Зарплата». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Випадково створити масив об'єктів класу Child3 (працівник, який отримує відсоток від продажів). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти по полю «Сума продажу». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Результат:

Випадково створити масив об'єктів класу Child1 (загальний вагон). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти за полем «Загальний дохід». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Випадково створити масив об'єктів класу Child2 (плацкартний вагон). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Відсортувати об'єкти по полю «Ціна квитка». Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.
Результат:
Завдання — IComparable (порівняння об'єктів)
Створи клас Учень (Student) з властивостями:
Прізвище
СереднійБал
Реалізуй інтерфейс IComparable, щоб учні автоматично сортувалися:
Спочатку за середнім балом (від більшого до меншого)
Якщо бали однакові — за прізвищем (за алфавітом)
Приклад тестування:
makefile
Копировать
Редактировать
Вхід:
Петренко, 10
Іваненко, 8
Сидоренко, 10
Вихід після сортування:
Петренко (10)
Сидоренко (10)
Іваненко (8)
💡 Підказка: У методі CompareTo спочатку порівняй бали, потім — прізвища.
Завдання — ICloneable (копіювання об'єктів)
Створи клас Книга (Book) з властивостями:
Назва
Автор
РікВидання
Реалізуй інтерфейс ICloneable, щоб можна було створювати повну копію книги.
Перевір, що зміни у копії не впливають на оригінал.
Приклад тестування:
makefile
Копировать
Редактировать
Оригінал: "Кобзар", Шевченко, 1840
Копія: "Кобзар", Шевченко, 1840
(Змінюємо рік у копії на 2025)
Вивід:
Оригінал: "Кобзар", Шевченко, 1840
Копія: "Кобзар", Шевченко, 2025
💡 Підказка: Використай метод MemberwiseClone() для швидкого копіювання.
Завдання — IEnumerable / IEnumerator (власна колекція)
Створення класу, що працює у foreach
Створи клас Рюкзак (Backpack), який містить список предметів (string[]).
Реалізуй IEnumerable, щоб можна було перебирати предмети у циклі foreach.
Приклад тестування:
csharp
Копировать
Редактировать
Backpack містить: ["Книга", "Пляшка води", "Ліхтарик"]
Вивід циклом foreach:
Книга
Пляшка води
Ліхтарик
💡 Підказка: У GetEnumerator() поверни свій клас-ітератор або використай yield return.
Об'єднай три інтерфейси в одній темі:
Створи клас Учень, який можна:
Сортувати (IComparable)
Копіювати (ICloneable)
Зберігати у власному класі КласУчнів (SchoolClass), що реалізує IEnumerable