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