Ответ
GetEnumerator — это ключевой метод интерфейса IEnumerable или IEnumerable<T>. Его основная задача — вернуть объект-перечислитель (IEnumerator), который используется для последовательного обхода элементов коллекции в циклах, таких как foreach.
Как это работает:
- Цикл
foreachнеявно вызывает методGetEnumerator()у коллекции. - Полученный перечислитель предоставляет методы
MoveNext()(переход к следующему элементу) и свойствоCurrent(текущий элемент). - Цикл продолжается, пока
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 с правильной сигнатурой.