Курсы по программированию

Формула программиста

основатель — Волосатов Евгений Витольдович
Поздравляю с 1 сентября! Система начисления Байтов работает.

Итератор / Итератор. Волшебное слово yield.

  • На этом уроке мы узнаем, как упростить создание итератора.
    Для этого достаточно просто написать нужный нам цикл,
    внутри которого воспользоватся волшебным словом yield.
  • Дата отправки отчёта: 26 мая 2018 г.
  • Задание выполнено: за 22 час. 44 мин.
  • Чему научился: Кл слово в методе yield ПОКАЗЫВАЕТ, что это метод является итератором, т.е. перечисляет и возвращает объекты по мере запроса.
    Чем отличается IEnumerator от IEnumerator<int>? В первом случае любой объект может возвращаться, а во втором все возвращаемые значения должны быть типа int ?
  • Оценка видео-уроку:
Отчёт от 17425 за Итератор / Итератор. Волшебное слово yield.




Оцени работу

 
Сохранить страницу:

10080. --
FireWolf
FireWolf
ответить
→  ser2018  # Итератор / Итератор. Волшебное слово yield. / 2018-05-28 22:58

IEnumerator взвращает просто object, который, если мы хотим что-то с ним сделать, надо будет ещё приводить к нужному типу. А если это значимый тип, вроде int, то ещё тратятся ресурсы на упаковку/распаковку. А если у нас несколько коллекций с разными типами, но все возвращают IEnumerable, т.е. просто object, можно легко запутаться и потом долго выискивать баги. А если сразу указать, какой именно IEnumerable мы получаем, то сразу имеем проверку соответствия типов ещё при написании программы и не тратим вычислительные ресурсы на упаковку/распаковку значимых типов.


17425. --
ser2018
ser2018
ответить
→  FireWolf  # Итератор / Итератор. Волшебное слово yield. / 2018-05-29 19:49

Можешь подсказать. Написал тест в консоли, в комментарии вопросы , мне не понятно зачем обязательно два опеределения:
1)  IEnumerator<int> IEnumerable<int>.GetEnumerator() - содержание  из этого показывается после MyIterator mIt = new MyIterator();
2)  public IEnumerator GetEnumerator() - это используетсяо в foreach

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            MyIterator mIt = new MyIterator();

            foreach (var i in mIt) {
                Console.WriteLine(i);
            }
            Console.ReadKey();
        }
    }

    class MyIterator :  IEnumerable<int>
    {
        //это опеределиние обязательное должено быть
        // в дебаггере в  объекте MyIterator mIt -> ResultView показывает, что содержит элементы {1,3}
        // но в forech, заходит в "IEnumerator GetEnumerator()" и перечисляет {20, "aaa"}, почему?
        IEnumerator<int> IEnumerable<int>.GetEnumerator()
        {
            yield return 1;
            yield return 3;
        }

        //это опеределиние обязательное должено быть, в деббагере попадаем именно сюда
        //хотя наследуем от IEnumerable<int>, почему так?
        public IEnumerator GetEnumerator()
        {
            yield return 20;
            yield return "aaa";
        }
    }
}


  • Отчёт оценивали:
    791Валерий Жданов+1   3922Александр+1   17443WildOrc+1   17606Виктор+1   17947Dmitry Sinitsin+1   10558Иван Воронин+1   10717OloloCode+1   1Евгений Волосатов+1   Посетитель+1   9980Timoha+1   16218Дмитрий+1   4395Денис+1   5394Anton+1   6452Кирилл Шмойлов+1   6644valerys Nikola+1   3747Сергей+1   10895Danil42Russia+1   10080FireWolf+1   9858Александр+1   16396Денис+1   8275Tekashnik+1   3850Григорий+1   14008Сергей +1   2146Иван+1   18683Roman0   8932Алекс+1   459Сергей Сергеевич+1   8835Булат+1  

Начинаем практику по языку C#





Если вы пришли без приглашения -
введите тысяча двадцать четыре (цифрами).
Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

После заполнения формы ты будешь подписан на рассылку «C# Вебинары и Видеоуроки», у тебя появится доступ к видеоурокам и консольным задачам.

Несколько раз в неделю тебе будут приходить письма — приглашения на вебинары, информация об акциях и скидках, полезная информация по C#.

Ты в любой момент сможешь отписаться от рассылки.


Научился: Использованию yield.
Yield позволяет избавится от реализации дополнительного класса , при использовании цикла foreach. И в определенных ситуациях оптимизировать вычисления при большом переборе значений.


Научился: На этом уроке мы наконец-то воспользовались помощью волшебного слова yield. Я еще не до конца прочувствовал эту тему. В голове возникал вопрос: "Для чего городить огород, если есть цикл foreach, который до этого всегда выручал и без использования этих интерфейсов!" Оказалось, что foreach также использует итератор, но неявно. На данный момент я понимаю так: Класс , являющийся коллекцией объектов, использует yield для реализации последовательного обращения ко всем своим элементам с начала до конца. При выполнении программы, yield создаёт класс, который содержит ряд методов по созданию счётчика перечисления, отслеживанию его переполнения, сброса при повторном обращении и тому подобное...