Чем отличаются IEnumerable и IEnumerator в C#

В C# IEnumerable<T> и IEnumerator являются интерфейсами, которые используются для перебора коллекций, но выполняют разные задачи.

IEnumerable<T>

IEnumerable<T> представляет коллекцию, которая может быть перечислена. Он определяет метод GetEnumerator(), который возвращает объект IEnumerator<T>.

Пример реализации:

public class MyCollection : IEnumerable<int>
{
    private int[] items = { 1, 2, 3 };
    
    public IEnumerator<int> GetEnumerator()
    {
        foreach (var item in items)
        {
            yield return item;
        }
    }
    
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

IEnumerator<T>

IEnumerator<T> представляет итератор, который позволяет перебирать элементы коллекции. Он определяет методы:

  • MoveNext() – переходит к следующему элементу,
  • Current – возвращает текущий элемент,
  • Reset() – сбрасывает итератор в начальное состояние.

Пример работы с IEnumerator<T>:

IEnumerator<int> enumerator = new MyCollection().GetEnumerator();

while (enumerator.MoveNext())
{
    Console.WriteLine(enumerator.Current);
}

Отличия IEnumerable<T> и IEnumerator<T>

ХарактеристикаIEnumerable<T>IEnumerator<T>
НазначениеПредставляет коллекциюУправляет процессом итерации
МетодыGetEnumerator()MoveNext(), Current, Reset()
ИспользованиеИспользуется в foreachИспользуется вручную

IEnumerable<T> предоставляет интерфейс для коллекции, а IEnumerator<T> управляет процессом итерации. foreach автоматически использует эти интерфейсы для удобного перебора элементов.