Не пойму я этот Yield - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Всё никак не могу вникнуть в его суть! Хотя в случаях, когда IEnumerable и IEnumerator реализуются без него, я всё понимаю Итак, вот примеры кода: "...Метод GetEnumerator() теперь и будет являться итератором..."
Листинг программы
  1. IEnumerator IEnumerable.GetEnumerator()
  2. {
  3. for (int i = 0; i < books.Length; i++)
  4. {
  5. yield return books[i];
  6. }
  7. }
Ок. Получается, что мы используем yield, чтобы не писать вручную методы интерфейса IEnumerator. Правильно? Вот вызываем в главной программе:
Листинг программы
  1. foreach (Book b in library)
  2. {
  3. Console.WriteLine(b.Name);
  4. }
А теперь "..Но оператор yield можно использовать внутри любого метода, только такой метод должен возвращать объект интерфейса IEnumerable. Подобные методы еще называют именованными итераторами."
Листинг программы
  1. public IEnumerable GetBooks(int max)
  2. {
  3. for (int i = 0; i < max; i++)
  4. {
  5. if (i == books.Length)
  6. {
  7. yield break;
  8. }
  9. else
  10. {
  11. yield return books[i];
  12. }
  13. }
  14. }
MAIN:
Листинг программы
  1. Library library = new Library();
  2. foreach (Book b in library.GetBooks(5))
  3. {
  4. Console.WriteLine(b.Name);
  5. }
В первом варианте еще ладно: мы называем метод итератором, он возвращает значение типа IEnumerator. Но тут мой мозг вспыхнул. Почему во втором примере метод, который возвращает IEnumerable - итератор? Почему в первом случае мы в foreach обращаемся к самой коллекции, а во втором - вызываем на ней метод? Насколько я понимаю, в общем случае foreach, чтобы приступить к работе с коллекцией, делает именно два шага: сначала приводит её к IEnumerable, а затем к IEnumerator. Пользуясь методами этого интерфейса, т.е. непосредственно ИТЕРАТОРОМ, он уже и перебирает коллекцию. Но я никак не могу связать примеры выше с этой теорией Прошу не отсылать меня на msdn, просто там эта тема объясняется поверхностно
Правильно я понимаю, что вызывая на коллекции метод, возвращающий IEnumerable, foreach, согласно моим предположениям выше, делает первый шаг, а потом благодаря

yield

перебирает коллекцию так, как если бы она реализовывала методы MoveNext, Reset и Current?

Решение задачи: «Не пойму я этот Yield»

textual
Листинг программы
  1. foreach (string element in UserCollection) //будет ошибка. А если добавить .Power(), как выше, то не будет
  2.                 Console.WriteLine(element);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы