Подтвердить что ты не робот

Почему IEnumerable <T> необходим, когда есть IEnumerator <T>?

Отказ от ответственности: Я понимаю разницу между IEnumerable<T> и IEnumerator<T> и как использовать оба. Это не дубликат этого или этого.

Это скорее вопрос дизайна - поскольку IEnumerator<T> уже инкапсулирует всю необходимую информацию (.Current, .MoveNext()) о чем-то, что можно перечислить, то какая точка введения типа (IEnumerable<T>) единственная цель которого - вернуть экземпляр первого?

Конкретно:

  • Почему foreach не может быть запрограммирован для итерации непосредственно через IEnumerator<T>, например:

    // foreach (var e in anEnumerator) { //... }
    while (anEnumerator.MoveNext())
    {
        doSomething(anEnumerator.Current);
    }
    
  • Почему Linq не может быть построен на основе непосредственно IEnumerator<T>?

4b9b3361

Ответ 1

Каждый из двух интерфейсов представляет собой очень разные понятия. IEnumerable<T> - это то, что "разрешает перечисление", где IEnumerator<T> - это представление самого перечисления.

Если бы вы объединили их вместе, было бы невозможно перечислить одну коллекцию несколько раз в одно и то же время (без какого-либо другого механизма на месте). Например, два потока, выполняющие foreach по массиву, больше не будут работать, где это вполне приемлемо в текущем проекте.