Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, Serginio1, Вы писали:
I>>>yield сам по себе вносит потери. Неважно, есть лишние циклы, или нет. x[i] заменяется на доступ через итератор. Вот уже проблема.
S>>То есть ты не согласен с тем, что без yield был бы возможен Linq?
I>Объясни подробно, каким образом ты делаешь такой вывод?
I>Я то говорю о производительности этого yield и прямо пишу, что твои слова "yield ничего не стоит" не подтверждаются
Еще раз. В моем сообщении было написано про то, что Linq не возможен без yield ибо идут вычисления справа налево.
S>>С yield IEnumerable создается автоматически. Заметь IEnumerable!
I>И что? Сколько стоит использование IEnumerable ?
То же что и yield, а именно MoveNext и Current
S>> То что ты пишешь ну никак не относится к
I>Это потому, что ты задним числом правишь сообщения.
Я подправил потому, что изначальный смыл в том, что вычисления идут с права налево и нет лишних циклов если бы вычисляли слева направо c созданием новых коллекций
S>> К которому ты упорно ставишь минусы и при этом сваливаешься на производительность yield.
I>Я только про это и говорю, потому как ты ты пишешь что yield ничего не стоит.
Этого я никогда не писал. Я писал про лишние циклы. Ибо yield как раз и обеспечивает вычисление с право налево. Перечитай сообщение.
S>>yield создает объект класса реализующий IEnumerable.
I>Ужос. И что дальше? Из этого следует, что yield ничего не стоит?
Где ты нашел про то, что yield ничего не стоит?
S>> Как замедляется доступ к энумератору если он вызывает MoveNext. Передается то IEnumerable а не List или array.
I>Не к энумератору, а к значению. Вместо x[i] у тебя будет обращение к moveNext, switch присваивание Current, чтение Current.
Ну я тебе подам на вход IEnumerable не основанном на List или array, как ты с ним будешь работать.
Это же Linq!!!
S>> Еще раз ответь с чем ты не согласен?
I>В который раз говорю — я не согласен с утверждением, что yield ничего не стоит.
Где я утверждал, что yield ничего не стоит?
Вот все сообщение
S>Linq, при кажущейся простоте, потребовал:
S>
S>
Generics
S>
Extension Methods
S>
Lamda expressions
S>
Expression trees
S>
Anonumus types
S>
Object initializers
S>
Type inferring
S>
S>Это огромный пласт работы. Но и результат до сих пор впечатляет.
S>Есть ли что-либо подобное на других языках/платформах?
Еще нужно добавить про yield и ленивое выполнение.
То есть при выполнении цепочки
list.Where.Where.Select.Count
List пройдет всего один цикл ибо выполнение начнется с права на лево
Count вызовет MoveNext у Select, Select у Where и так далее.
По этому мы можем объединять Where без потери производительности на лишние циклы
главное, что yield обеспечивает вычисление справа на лево!!!
С yield IEnumerable создается автоматически. Если тебе где то в конце цепочки вызовов итераторов понадобится Top(5) или FirstOrDefault
то тебе не нужно перебирать всю коллекцию (возможно и не один раз) и вызвать все лямбды, new в цепочке расширений если вычисления идут слева направо.