Один способ вспомнить, как это работает, рассмотреть это: итератор не будет работать, если будет продолжать вызывать ваш метод снова и снова.
Ваш метод возвращает список элементов. Если цикл будет вызывать ваш метод снова и снова, он (за исключением побочных эффектов) будет продолжать возвращать тот же список. Как цикл узнает во втором вызове, что он уже обработал первый элемент в списке?
Все, что вы можете перечислить, имеет метод GetEnumerator()
, который должен возвращать тип (обычно это тип, реализующий IEnumerator, , но это не обязательно должно быть ). Возвращаемый тип должен иметь свойство Current
и метод MoveNext()
.
Возвращаемый тип - это ваш объект перечислителя, и ваш цикл foreach содержит ссылку на этот объект перечислителя при перечислении. Он продолжает вызывать Current
и MoveNext()
для этого объекта перечислителя, пока MoveNext()
не вернет false.
Использование foreach
обычно более читабельно и удобно, но вы также можете перечислить «вручную», если хотите:
List<string> dates = someMethodCall();
IEnumerator<string> myEnumerator = dates.GetEnumerator();
while (myEnumerator.MoveNext())
{
// do something with myEnumerator.Current
}