Re[17]: Догонит ли net java?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.12.22 21:46
Оценка: +1
Здравствуйте, ·, Вы писали:
S>>·>Немного многословно, приходится типы полей прописывать, но вполне юзабельно.
S>> Кстати в Java завезли аналог IEnumerable c yield
·>yield как конструкцию языка нет, не завезли. Другие средства есть на уровне библиотек, вроде хватает.

S>>То есть вызов осуществляется с права на лево как в C#?

·>Классика map-reduce — вначале строится цепочка преобразований (flatmaps & Co) потом коллектор (reduce). Коллектор тащит всё через цепочку. Вроде слева направо. Не знаю что ты имеешь в виду "как в C#".
Ну в C# ты получаешь IEnumerable. Причем не первый а последний. При MoveNext последний дергает MoveNext предыдущего.
И получается, что у самого первого будет проходов равного его размера.
То есть IEnumerable.Range(1,3).Select(i=> new {twice = i * 2, str = "val" + i}).Where(v => v.twice > 3 && v.str.contains("3"));

можно разложить на несколко операторов
list=IEnumerable.Range(1,3);
Обозначим анонимный тип new {twice = i * 2, str = "val" + i} как TResult
select=Enumerable.Select<int,TResult>(list, i=> new {twice = i * 2, str = "val" + i})
и поледний
result=IEnumerable.Where<TResult>(select, v => v.twice > 3 && v.str.contains("3"));

В Итоге ты получаешь IEnumerable<TResult>

И когда ты начинаешь обход или то вызываешь MoveNext у result

result вызовет MoveNext у select, а select у list.
То есть вызов идет с права на лево
Можно посмотреть на исходники https://github.com/microsoft/referencesource/blob/master/System.Core/System/Linq/Enumerable.cs
Ленивость сделана через yield.
Вернее yield создает анонимный класс реализующий IEnumerable Что такое yield и как он работает в C#?

Внутри этого класса State Machine. Кстати по этому же принципу работает и async/await/
То есть компилятор берет на себя генерацию анонимных классов (или уже существующих как WhereEnumerableIterator<TSource>) реализующих State Machine и методов IEnumerable MoveNext и Current в итоге.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 10.12.2022 8:30 Serginio1 . Предыдущая версия . Еще …
Отредактировано 10.12.2022 8:22 Serginio1 . Предыдущая версия .
Отредактировано 09.12.2022 21:48 Serginio1 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.