Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, Serginio1, Вы писали:
S>>И. Еще раз там используются ленивые иераторы?
I>Итератор всегда ленивый. Никто тебя не заставляет вызывает MoveNext больше, чем тебе надо. И создавать итератор, раньше чем тебе надо, не нужно.
I>И копировать данные для итератора при создании тоже не нужно.
I>то есть, всё и так ленивое, без твоих yield.
Ты совсем не читаешь. Издеваешься. Ленивость это когда код начинается вызваться не до создания итератора, а после его создания.
https://rsdn.org/article/csharp/CSharp_Iterators.xmlАвтор(ы): Тепляков Сергей Владимирович
Дата: 23.06.2011
В статье рассматривается шаблон проектирования «Итератор» в контексте языка проектирования C#, включая особенности реализации блока итератора компилятором языка.
Можно сказать, что каждый блок кода, между операторами yield return выполняется отложенно (lazily) только после очередного вызова метода MoveNext. Именно на этом основана ленивость библиотеки LINQ, которая построена в виде методов расширения интерфейсов IEnumerable и IEnumerable<T>.
Тебе обязательно нужно поставить минус!!!!
S>>Сколько в итоге будет итераций?
S>>https://stackoverflow.com/questions/21782380/are-java-8-streams-the-same-as-net-ienumerable
I>Столько же. Посмотри интерфейс этого стрима и прекрати пороть чушь.
I>>>Четвертый раз — вместо x[i] у тебя MoveNext, проход через switch, присваивание Current и чтение Current
I>>>И вот эта каша крайне плохо инлайнится, а следовательно ест больше чем весит.
I>>>Заметь — это уже в четвертый раз я пишу, а до тебя не доходит.
Ты издеваешься? Я тебе привожу ссылки где написано, что ленивости там никакой нет.
Ты должен доказать, что товарищ не прав!
S>> Ну в итоге вывод один. Ты против yield,
I>А ты, упорный. Раз я с тобой не согласен, значит — против yield
Минус за что!
>> но сам то Linq построен на ленивом создании итераторов.
I> Что значит "ленивое создание итераторов" ? Он и до введения yield создавался только по требованию, т.е. ленивым образом. А сам итератор и без тебя ленивый.
List создается то того как дергается его MoveNext, и дергает родительский MoveNext!!!
S>>А yield как раз этим и занимается. Так понятнее.
I>Нет, не понятно. Итератор сам по себе ленивый, и так было до yield. И создавался ленивым образом, тоже до yield.
Дааааа. То есть ты про List так и не ответил.
S>> Для тебя лишние итерации, вызов лямбда выражений, селекты ничего не стоят!!!
I>Так было и до введения yield. Это бенефиты IEnumerable, они работают и без yield.
Еще раз List это IEnumerable но он нихрена не ленив.
I>>>Откуда такой вывод? Я и слева направо обгоню это IEnumerable с не меньшим бенефитом.
S>> Даааа!! вот твой же пример с миллионами строк пр этом первая же строка удовлетворяе условию.
S>>Вот такие у тебя профайлеры. Но минус то ты мне ставишь!!
I>Именно. x[0] инлайнится враз и стоит считай бесплатно. А x.FirstOrDefault() в сравнении с этим неимоверно дорог.
I>Например, когда эта операция одна из основных в экспоненциальном алгоритме, любая издержка дает конское отставание.
То есть выполнить 5 создания классов, вызов лямбд будет больше чем миллионы вызовов [x] лямбд и селектов.
Я хренею!!!
I>Не смеши людей. Я портировал часть Linq и ODATA на JavaScript, а что сделал ты ?
Ну ты молодец!! Я так херню всякую пишу и тебе в подметки не гожусь.
I>>>Вот снова ересь — ленивость создаёт сам IEnumerable и никак иначе. Вобщем, каша. То одно пишешь, то другое, прямо противоположное
S>>Нет. Заполнение List не лениво!!!!!
I>А зачем мне list если мне нужна только итерация? Создаем итератор, итерируемся, пока это нужно, профит. Все что надо — один класс создаём явно. yield — делает ровно то же, но не явно. Вся разница. И ленивости в каждом случае ровно одинаково.
Какой итератор ты создаешь? List тоже итератор
S>>Вот именно, сам разберись. Пока все не в тему. И ну и явно ты не разобрался с темой.
S>>Почитай https://pvs-studio.com/ru/b/0808/#ID4EFF844D56
I>Разобрался примерно в 2003м году на корутинах Питона, а в 2008 нашел в С# yield
Ну тогда за что минус!!