На этом уроке мы узнаем, как упростить создание итератора. Для этого достаточно просто написать нужный нам цикл, внутри которого воспользоватся волшебным словом yield.
Дата отправки отчёта:
26 мая 2018 г.
Задание выполнено: за
22 час. 44 мин.
Чему научился:
Кл слово в методе yield ПОКАЗЫВАЕТ, что это метод является итератором, т.е. перечисляет и возвращает объекты по мере запроса. Чем отличается IEnumerator от IEnumerator<int>? В первом случае любой объект может возвращаться, а во втором все возвращаемые значения должны быть типа int ?
IEnumerator взвращает просто object, который, если мы хотим что-то с ним сделать, надо будет ещё приводить к нужному типу. А если это значимый тип, вроде int, то ещё тратятся ресурсы на упаковку/распаковку. А если у нас несколько коллекций с разными типами, но все возвращают IEnumerable, т.е. просто object, можно легко запутаться и потом долго выискивать баги. А если сразу указать, какой именно IEnumerable мы получаем, то сразу имеем проверку соответствия типов ещё при написании программы и не тратим вычислительные ресурсы на упаковку/распаковку значимых типов.
Можешь подсказать. Написал тест в консоли, в комментарии вопросы , мне не понятно зачем обязательно два опеределения: 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. Валерий Жданов+13922. Александр+117443. WildOrc+117606. Виктор+117947. Dmitry Sinitsin+110558. Иван Воронин+110717. OloloCode+11. Евгений Волосатов+1Посетитель+19980. Timoha+116218. Дмитрий+14395. Денис+15394. Anton+16452. Кирилл Шмойлов+16644. valerys Nikola+13747. Сергей+110895. Danil42Russia+110080. FireWolf+19858. Александр+116396. Денис+18275. Tekashnik+13850. Григорий+114008. Сергей +12146. Иван+118683. Roman08932. Алекс+1459. Сергей Сергеевич+18835. Булат+1
Начинаем практику по языку C#
Чтобы стать хорошим программистом — нужно писать программы.
На нашем сайте очень много практических упражнений.
После заполнения формы ты будешь подписан на рассылку
«C# Вебинары и Видеоуроки»,
у тебя появится доступ к видеоурокам и консольным задачам.
Несколько раз в неделю тебе будут приходить письма —
приглашения на вебинары, информация об акциях и скидках,
полезная информация по C#.
Научился: Использованию yield. Yield позволяет избавится от реализации дополнительного класса , при использовании цикла foreach. И в определенных ситуациях оптимизировать вычисления при большом переборе значений.
Научился: На этом уроке мы наконец-то воспользовались помощью волшебного слова yield. Я еще не до конца прочувствовал эту тему. В голове возникал вопрос: "Для чего городить огород, если есть цикл foreach, который до этого всегда выручал и без использования этих интерфейсов!" Оказалось, что foreach также использует итератор, но неявно. На данный момент я понимаю так: Класс , являющийся коллекцией объектов, использует yield для реализации последовательного обращения ко всем своим элементам с начала до конца. При выполнении программы, yield создаёт класс, который содержит ряд методов по созданию счётчика перечисления, отслеживанию его переполнения, сброса при повторном обращении и тому подобное...