Что такое метод GetEnumerator в C#?

«Что такое метод GetEnumerator в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

GetEnumerator — это ключевой метод интерфейса IEnumerable или IEnumerable<T>. Его основная задача — вернуть объект-перечислитель (IEnumerator), который используется для последовательного обхода элементов коллекции в циклах, таких как foreach.

Как это работает:

  1. Цикл foreach неявно вызывает метод GetEnumerator() у коллекции.
  2. Полученный перечислитель предоставляет методы MoveNext() (переход к следующему элементу) и свойство Current (текущий элемент).
  3. Цикл продолжается, пока MoveNext() возвращает true.

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

List<string> colors = new List<string> { "Red", "Green", "Blue" };
IEnumerator<string> enumerator = colors.GetEnumerator(); // Получаем перечислитель

while (enumerator.MoveNext()) // Перемещаемся к следующему элементу
{
    string currentColor = enumerator.Current; // Получаем текущий элемент
    Console.WriteLine(currentColor);
}
// Вывод: Red, Green, Blue

Создание своей коллекции с yield return: Прямая реализация GetEnumerator может быть громоздкой. Ключевые слова yield return в C# позволяют создать перечислитель с отложенным выполнением (lazy evaluation) очень просто:

public IEnumerable<int> GetEvenNumbers(int max)
{
    for (int i = 0; i <= max; i++)
    {
        if (i % 2 == 0)
        {
            yield return i; // Компилятор автоматически строит за нас класс перечислителя
        }
    }
}

// Использование
foreach (int num in GetEvenNumbers(10))
{
    Console.Write(num + " "); // Вывод: 0 2 4 6 8 10
}

Итог: GetEnumerator — это фундаментальный механизм, лежащий в основе итерации в .NET. Для поддержки foreach ваш класс должен либо реализовать интерфейс IEnumerable, либо просто объявить публичный метод GetEnumerator с правильной сигнатурой.