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

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

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

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

yield

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

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

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

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


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

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

5   голосов , оценка 4.4 из 5
Похожие ответы