Sobes.tech
Назад к вопросам
Junior — Middle
60

Какие способы реализуют интерфейс IEnumerable в языке программирования?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

IEnumerable реализуют в первую очередь через перечислитель: вручную, возвращая IEnumerator из GetEnumerator(), либо автоматически с помощью yield return. Также интерфейс уже реализован многими стандартными коллекциями .NET, поэтому их обычно не нужно писать с нуля. На собеседовании важно показать, что IEnumerable — это про последовательный перебор элементов, а не про доступ по индексу.

Определение:

IEnumerable — это интерфейс, который позволяет объекту быть перебираемым в foreach. Для его реализации нужно предоставить способ получить перечислитель через метод GetEnumerator(). В C# это можно сделать двумя основными способами: явно написать перечислитель или использовать yield return, чтобы компилятор сам сгенерировал нужный код.

Пример использования:

using System;
using System.Collections;
using System.Collections.Generic;

public class Numbers : IEnumerable<int>
{
    private readonly int[] _data = { 1, 2, 3 };

    public IEnumerator<int> GetEnumerator()
    {
        foreach (var item in _data)
            yield return item;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

class Program
{
    static void Main()
    {
        var numbers = new Numbers();

        foreach (var n in numbers)
        {
            Console.WriteLine(n);
        }
    }
}

Пояснение кода:

В этом примере класс Numbers реализует IEnumerable<int>, значит по нему можно пройтись в foreach.
Метод GetEnumerator() возвращает перечислитель; здесь он написан через yield return, поэтому элементы выдаются по одному без ручной реализации отдельного класса-итератора.
Второй метод IEnumerable.GetEnumerator() нужен для совместимости с не-обобщённым интерфейсом и просто делегирует вызов обобщённой версии.
При foreach компилятор вызывает GetEnumerator(), затем последовательно читает элементы через перечислитель.

Ключевые моменты:

  • IEnumerable реализуют через метод GetEnumerator(), который возвращает IEnumerator.
  • В C# самый удобный способ — yield return, он упрощает написание перечислителя.
  • Многие стандартные коллекции уже реализуют IEnumerable/IEnumerable<T>.
  • IEnumerable описывает только перебор элементов, а не изменение коллекции.
  • Для IEnumerable<T> обычно также нужен явный метод IEnumerable.GetEnumerator() для не-обобщённого интерфейса.