Назад Вперед Зміст

Стандартні інтерфейси IEnumerable,IEnumerator та IDisposable у C#

Інтерфейси IEnumerable та IEnumerator дозволяють створювати об’єкти, по яких можна проходити у циклі foreach.Вони є основою всіх колекцій у .NET.

Інтерфейс IDisposable використовується для звільнення невикористовуваних ресурсів,наприклад, закриття файлів, з’єднань з базами даних, вивільнення пам’яті чи дескрипторів.

1. Опис інтерфейсів

Основна ідея: Клас, що реалізує IEnumerable, може використовуватися в foreach, LINQ та інших механізмах перебирання елементів.

2. Приклад власної колекції


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);
        }
    }
}

3. Таблиця тестування

Крок Дія Вивід у консоль
1 Створення колекції MyCollection (Немає виводу)
2 Запуск foreach Один
Два
Три

Висновок

Інтерфейси IEnumerable та IEnumerator — це базові механізми ітерації у C#. Власні колекції, які їх реалізують, можуть інтегруватися з усіма інструментами, що працюють з переліками даних.

Стандартний інтерфейс IDisposable у C#

Інтерфейс IDisposable використовується для звільнення невикористовуваних ресурсів, наприклад, закриття файлів, з’єднань з базами даних, вивільнення пам’яті чи дескрипторів.

Метод: void Dispose() — викликається для очищення ресурсів.

1. Приклад власного класу з IDisposable


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()
    }
}

2. Використання з оператором using

Оператор using гарантує, що метод Dispose() буде викликано автоматично після завершення блоку коду, навіть якщо виникла помилка.


using (FileWriter fw = new FileWriter("data.txt"))
{
    fw.WriteLine("Hello, world!");
}

Таблиця тестування

Крок Дія Вивід у консоль
1 Створення об'єкта FileWriter Файл відкрито для запису.
2 Запис кількох рядків (Немає виводу у консоль)
3 Вихід з блоку using Файл закрито та ресурси звільнено.

Висновок

Інтерфейс IDisposable — ключовий інструмент у керуванні ресурсами. У поєднанні з using він дозволяє писати безпечний код, який автоматично звільняє ресурси, зменшуючи ризик витоків пам’яті та блокування файлів.

Варіанти завдань

Використовувати класи зі свого варіанту № 5_9 (створення інтерфейсу користувача). Сортування виконувати за зростанням значень.

Варіант 1

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

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

Результат:

Варіант 2

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

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

Результат:

Варіант 3

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

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

Результат:

Варіант 4

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

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

Результат:

Варіант 5

Випадково створити масив об'єктів класу Child1 (допомога з інвалідності). Застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран. Сортувати за полем Група інвалідності. Ще раз застосувати до кожного об'єкта методи класу і вивести елементи масиву на екран.

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

Результат:

Варіант 6

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

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

Результат:

Варіант 7

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

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

Результат:

Варіант 8

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

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

Результат:

Варіант 9

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

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

Результат:

Варіант 10

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

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

Результат:

Варіант 11

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

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

Результат:

Варіант 12

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

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

Результат:

Варіант 13

Завдання — IComparable (порівняння об'єктів)

Створи клас Учень (Student) з властивостями:

Прізвище

СереднійБал

Реалізуй інтерфейс IComparable, щоб учні автоматично сортувалися:

Спочатку за середнім балом (від більшого до меншого)

Якщо бали однакові — за прізвищем (за алфавітом)

Приклад тестування:


makefile
Копировать
Редактировать
Вхід:
  Петренко, 10
  Іваненко, 8
  Сидоренко, 10

Вихід після сортування:
  Петренко (10)
  Сидоренко (10)
  Іваненко (8)
💡 Підказка: У методі CompareTo спочатку порівняй бали, потім — прізвища.

Варіант 14

Завдання — ICloneable (копіювання об'єктів)

Створи клас Книга (Book) з властивостями:

Назва

Автор

РікВидання

Реалізуй інтерфейс ICloneable, щоб можна було створювати повну копію книги.

Перевір, що зміни у копії не впливають на оригінал.

Приклад тестування:


makefile
Копировать
Редактировать
Оригінал: "Кобзар", Шевченко, 1840
Копія:    "Кобзар", Шевченко, 1840

(Змінюємо рік у копії на 2025)

Вивід:
Оригінал: "Кобзар", Шевченко, 1840
Копія:    "Кобзар", Шевченко, 2025

💡 Підказка: Використай метод MemberwiseClone() для швидкого копіювання.

Варіант 15

Завдання — IEnumerable / IEnumerator (власна колекція)

Створення класу, що працює у foreach

Створи клас Рюкзак (Backpack), який містить список предметів (string[]).

Реалізуй IEnumerable, щоб можна було перебирати предмети у циклі foreach.

Приклад тестування:


csharp
Копировать
Редактировать
Backpack містить: ["Книга", "Пляшка води", "Ліхтарик"]

Вивід циклом foreach:
Книга
Пляшка води
Ліхтарик

💡 Підказка: У GetEnumerator() поверни свій клас-ітератор або використай yield return.

Варіант 16

🎯 Додатковий рівень (для швидких учнів)

Об'єднай три інтерфейси в одній темі:

Створи клас Учень, який можна:

Сортувати (IComparable)

Копіювати (ICloneable)

Зберігати у власному класі КласУчнів (SchoolClass), що реалізує IEnumerable

Назад Вперед Зміст