Здравствуйте, Serginio1, Вы писали:
S> Да можно оптимизировать и инлайнить, но мало кому это нужно.
Вообще-то много кому нужно и много где нужно, так как линк действительно порой может сильно повысить читаемость и наглядность кода.
S> Я тебе приводил примеры на оптимизацию Linq https://mattwarren.org/2016/09/29/Optimising-LINQ/ S>И поверь мало кто ими пользуются.
Мало им пользуются, потому что не ясна его поддержка, и последнее обновление 3 года назад тому подтверждение.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[18]: Есть ли подобие LINQ на других языках/платформах?
I>>yield сам по себе вносит потери. Неважно, есть лишние циклы, или нет. x[i] заменяется на доступ через итератор. Вот уже проблема.
S>То есть ты не согласен с тем, что без yield был бы возможен Linq?
Объясни подробно, каким образом ты делаешь такой вывод?
Я то говорю о производительности этого yield и прямо пишу, что твои слова "yield ничего не стоит" не подтверждаются
S>С yield IEnumerable создается автоматически. Заметь IEnumerable!
И что? Сколько стоит использование IEnumerable ?
S> То что ты пишешь ну никак не относится к
Это потому, что ты задним числом правишь сообщения.
S> К которому ты упорно ставишь минусы и при этом сваливаешься на производительность yield.
Я только про это и говорю, потому как ты ты пишешь что yield ничего не стоит.
S>yield создает объект класса реализующий IEnumerable.
Ужос. И что дальше? Из этого следует, что yield ничего не стоит?
S> Как замедляется доступ к энумератору если он вызывает MoveNext. Передается то IEnumerable а не List или array.
Не к энумератору, а к значению. Вместо x[i] у тебя будет обращение к moveNext, switch присваивание Current, чтение Current.
S> Еще раз ответь с чем ты не согласен?
В который раз говорю — я не согласен с утверждением, что yield ничего не стоит.
Re[12]: Есть ли подобие LINQ на других языках/платформах?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>>>Прошедшее это какое? В 2008 там его не было, а код был стар на тот момент, как говно мамонта. I>>.net 3.5, т.е. c linq, вышел в конце 2007го года. Вероятно, в 2008 еще не успели натаскать, а вот примерно к 2009..2011му постарались
НС>До 2010 там точно никакого линка не было.
Я привел dotMemory 64 потому как это был последний мой продакшн опыт с дотнетом — я год сидел в профайлерах, а dotMemory 64 был только early access. Я его поюзал неделю и выбросил. Выясни, когда брейнсы сделали первый релиз и сузим диапазон до года-двух
I>>Собственно, эта штука обсуждалась на сколько помню на рсдн. Лень искать.
НС>Обсуждалась на рсдн другая история, не про форматтер. В форматтере линка никогда не было.
А что, по твоему, обсуждалось на РСДН?
Re[19]: Есть ли подобие LINQ на других языках/платформах?
Здравствуйте, rameel, Вы писали:
R>Здравствуйте, Serginio1, Вы писали:
S>> Да можно оптимизировать и инлайнить, но мало кому это нужно.
R>Вообще-то много кому нужно и много где нужно, так как линк действительно порой может сильно повысить читаемость и наглядность кода.
S>> Я тебе приводил примеры на оптимизацию Linq https://mattwarren.org/2016/09/29/Optimising-LINQ/ S>>И поверь мало кто ими пользуются.
R>Мало им пользуются, потому что не ясна его поддержка, и последнее обновление 3 года назад тому подтверждение.
Если бы реально была нужна, то завалили бы предложениями, однако это не так.
Учитывая развите Sourse generator то можно и там развернуться.
и солнце б утром не вставало, когда бы не было меня
Re[19]: Есть ли подобие LINQ на других языках/платформах?
Здравствуйте, 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>Это огромный пласт работы. Но и результат до сих пор впечатляет.
S>Есть ли что-либо подобное на других языках/платформах?
Еще нужно добавить про yield и ленивое выполнение.
То есть при выполнении цепочки
list.Where.Where.Select.Count
List пройдет всего один цикл ибо выполнение начнется с права на лево
Count вызовет MoveNext у Select, Select у Where и так далее.
По этому мы можем объединять Where без потери производительности на лишние циклы
главное, что yield обеспечивает вычисление справа на лево!!!
С yield IEnumerable создается автоматически. Если тебе где то в конце цепочки вызовов итераторов понадобится Top(5) или FirstOrDefault
то тебе не нужно перебирать всю коллекцию (возможно и не один раз) и вызвать все лямбды, new в цепочке расширений если вычисления идут слева направо.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
I>>И что? Сколько стоит использование IEnumerable ? S> То же что и yield, а именно MoveNext и Current
Именно.
S> Я подправил потому, что изначальный смыл в том, что вычисления идут с права налево и нет лишних циклов если бы вычисляли слева направо c созданием новых коллекций
Ты путаешь linq и ленивую обработку коллекций. Linq это про соответствующие расширения, которые можно навесить на любой интерфейс, а не только IEnumerable. Более того — совсем необязательно это будет коллекция.
RX, XML, WMI, IQueryable и тд и тд и тд.
Т.е. yield это частный случай для IEnumerable. То есть, частный случай частного случая
S> Где ты нашел про то, что yield ничего не стоит?
Ты так пишешь.
I>>Не к энумератору, а к значению. Вместо x[i] у тебя будет обращение к moveNext, switch присваивание Current, чтение Current. S> Ну я тебе подам на вход IEnumerable не основанном на List или array, как ты с ним будешь работать. S>Это же Linq!!!
Не подашь. У меня параметры это массивы в явном виде шоб люди навроде тебя не подпихивали хрень и не заявляли "Ваша обработка коллекций тормозит после того, как я сто фильтров объединил"
S> главное, что yield обеспечивает вычисление справа на лево!!!
yield это просто последовательность, а не "слева направо". А вот как будут реальные элементы данных выбираться — как угодно.
S>то тебе не нужно перебирать всю коллекцию (возможно и не один раз) и вызвать все лямбды, new в цепочке расширений если вычисления идут слева направо.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, Serginio1, Вы писали:
I>>>И что? Сколько стоит использование IEnumerable ? S>> То же что и yield, а именно MoveNext и Current
I>Именно.
S>> Я подправил потому, что изначальный смыл в том, что вычисления идут с права налево и нет лишних циклов если бы вычисляли слева направо c созданием новых коллекций
I>Ты путаешь linq и ленивую обработку коллекций. Linq это про соответствующие расширения, которые можно навесить на любой интерфейс, а не только IEnumerable. Более того — совсем необязательно это будет коллекция. I>RX, XML, WMI, IQueryable и тд и тд и тд.
I>Т.е. yield это частный случай для IEnumerable. То есть, частный случай частного случая
private static IEnumerable<TSource> WhereIterator<TSource>(IEnumerable<TSource> source, Func<TSource, int, bool> predicate)
{
int index = -1;
foreach (TSource element in source)
{
checked
{
index++;
}
if (predicate(element, index))
{
yield return element;
}
}
}
S>> Где ты нашел про то, что yield ничего не стоит?
I>Ты так пишешь.
I>>>Не к энумератору, а к значению. Вместо x[i] у тебя будет обращение к moveNext, switch присваивание Current, чтение Current. S>> Ну я тебе подам на вход IEnumerable не основанном на List или array, как ты с ним будешь работать. S>>Это же Linq!!!
I>Не подашь. У меня параметры это массивы в явном виде шоб люди навроде тебя не подпихивали хрень и не заявляли "Ваша обработка коллекций тормозит после того, как я сто фильтров объединил"
То есть вычисления слева направо. И если мне нужно вернуть из метода Ienumrable и к нему применить свои действия и вернуть другой енумератор это все будут новые списки.
И вот в конце наконец вызвать FirstOrDefault вот она вся прелесть вычислений справо на лево в отличие от твой позиции с вычислением слева направо
S>> главное, что yield обеспечивает вычисление справа на лево!!!
I>yield это просто последовательность, а не "слева направо". А вот как будут реальные элементы данных выбираться — как угодно.
Нет именно слева направо. Потому что мы вызываем MoveNext у последнего элемента в цепочке, а он уже зовет у своего родителя. S>>то тебе не нужно перебирать всю коллекцию (возможно и не один раз) и вызвать все лямбды, new в цепочке расширений если вычисления идут слева направо.
На этом основан Linq. И часто новички пишут вместо yield
var result= new List<TSource>();
foreach (TSource element in source)
{
if (predicate(element, index))
{
// yield return element;
result.Add(element);
}
}
return result;
При этом тратя лишнюю память и вычислений predicate если уже в вычислениях отпала необходимость. I>Это тот самый частный случай.
Это один из массовых случаев Where
Ну и можно посмотреть тот же Select
private static IEnumerable<TResult> SelectIterator<TSource, TResult>(IEnumerable<TSource> source, Func<TSource, int, TResult> selector)
{
int index = -1;
foreach (TSource element in source)
{
checked
{
index++;
}
yield return selector(element, index);
}
}
Да для первоначальных коллекций там оптимизировано в том, реализован MoveNext по аналогии с тем, что трансформиует yield
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
if (source == null) throw Error.ArgumentNull("source");
if (predicate == null) throw Error.ArgumentNull("predicate");
if (source is Iterator<TSource>) return ((Iterator<TSource>)source).Where(predicate);
if (source is TSource[]) return new WhereArrayIterator<TSource>((TSource[])source, predicate);
if (source is List<TSource>) return new WhereListIterator<TSource>((List<TSource>)source, predicate);
return new WhereEnumerableIterator<TSource>(source, predicate);
}
public override bool MoveNext() {
switch (state) {
case 1:
enumerator = source.GetEnumerator();
state = 2;
goto case 2;
case 2:
while (enumerator.MoveNext()) {
TSource item = enumerator.Current;
if (predicate(item)) {
current = item;
return true;
}
}
Dispose();
break;
}
return false;
}
Кстати еще раз посмотрел исходники они заккоментировали
И заменили их классами наследующие abstract class Iterator<TSource> : IEnumerable<TSource>, IEnumerator<TSource> которые по сути генерит yield при компиляции. Но в остальном методы используют yield.
На yield построен Linq
Непонятно?
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>На yield построен Linq S>Непонятно?
Как тебе такой linq без yield и даже без IEnumerable?
static void Main()
{
var n =
from c in 1.ToMaybe()
from s in"2".ToMaybe()
from x in 2.ToMaybe()
select s + c + x;
Console.WriteLine(n);
}
abstract class Maybe<T>
{
public class Nothing : Maybe<T> {}
public class Just : Maybe<T>
{
public T Value;
}
public override string ToString() => this switch
{
Just j => j.Value.ToString(),
_ => "Nothing"
};
}
static class Extensions
{
public static Maybe<T> ToMaybe<T>(this T value)
{
return value == null ? (Maybe<T>)new Maybe<T>.Nothing() : new Maybe<T>.Just { Value = value };
}
public static Maybe<T2> SelectMany<T1,T2>(
this Maybe<T1> source, Func<T1,Maybe<T2>> selector)
{
if (source is Maybe<T1>.Just j) return selector(j.Value);
return new Maybe<T2>.Nothing();
}
public static Maybe<T3> SelectMany<T1,T2,T3>(
this Maybe<T1> source, Func<T1,Maybe<T2>> collectionSelector, Func<T1,T2,T3> resultSelector)
{
return source.SelectMany(x => collectionSelector(x).SelectMany(y => resultSelector(x, y).ToMaybe()));
}
}
Если нам не помогут, то мы тоже никого не пощадим.
Re[23]: Есть ли подобие LINQ на других языках/платформах?
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Serginio1, Вы писали:
S>>На yield построен Linq S>>Непонятно?
IT>Как тебе такой linq без yield и даже без IEnumerable?
IT>
IT>static void Main()
IT>{
IT> var n =
IT> from c in 1.ToMaybe()
IT> from s in"2".ToMaybe()
IT> from x in 2.ToMaybe()
IT> select s + c + x;
IT> Console.WriteLine(n);
IT>}
IT>abstract class Maybe<T>
IT>{
IT> public class Nothing : Maybe<T> {}
IT> public class Just : Maybe<T>
IT> {
IT> public T Value;
IT> }
IT> public override string ToString() => this switch
IT> {
IT> Just j => j.Value.ToString(),
IT> _ => "Nothing"
IT> };
IT>}
IT>static class Extensions
IT>{
IT> public static Maybe<T> ToMaybe<T>(this T value)
IT> {
IT> return value == null ? (Maybe<T>)new Maybe<T>.Nothing() : new Maybe<T>.Just { Value = value };
IT> }
IT> public static Maybe<T2> SelectMany<T1,T2>(
IT> this Maybe<T1> source, Func<T1,Maybe<T2>> selector)
IT> {
IT> if (source is Maybe<T1>.Just j) return selector(j.Value);
IT> return new Maybe<T2>.Nothing();
IT> }
IT> public static Maybe<T3> SelectMany<T1,T2,T3>(
IT> this Maybe<T1> source, Func<T1,Maybe<T2>> collectionSelector, Func<T1,T2,T3> resultSelector)
IT> {
IT> return source.SelectMany(x => collectionSelector(x).SelectMany(y => resultSelector(x, y).ToMaybe()));
IT> }
IT>}
IT>
Спасибо Интересно не знал, что SQL синтаксис может работать не только с IEnumerable.
И прикольно смотреть как действуют collectionSelector и resultSelector
И в 2008 работает! Вот так век живи и век учись!!!
Ну для меня запись типа намного более читаема
var selectedUsers = from user in users
from lang in user.Languages
where user.Age < 28
where lang == "английский"select user;
чем
var selectedUsers = users.SelectMany(u => u.Languages,
(u, l) => new { User = u, Lang = l })
.Where(u => u.Lang == "английский" && u.User.Age < 28)
.Select(u=>u.User);
Все достаточно просто, если выразить через методы расширения
var n = 1.ToMaybe().SelectMany(u => "2".ToMaybe(),
(c, s) => new { c, s })
.SelectMany(u => 2.ToMaybe(),
(t, x) => t.s + t.c + x);
Console.WriteLine(n);
Спасибо! Все таки зашоренное мышление немного приоткрыть.
посмотрел как отрабатывают SelectMany и collectionSelector и resultSelector
public static Maybe<T2> SelectMany<T1, T2>(
this Maybe<T1> source, Func<T1, Maybe<T2>> selector)
{
if (source is Maybe<T1>.Just j)
return selector(j.Value);
return new Maybe<T2>.Nothing();
}
public static T1 Ret<T1>(T1 value)
{
return value;
}
public static T1 Ret2<T1>(T1 value)
{
return value;
}
public static Maybe<T3> SelectMany<T1, T2, T3>(
this Maybe<T1> source, Func<T1, Maybe<T2>> collectionSelector, Func<T1, T2, T3> resultSelector)
{
return source.SelectMany(x =>
collectionSelector(Ret(x))
.SelectMany(y =>
resultSelector(x, Ret2(y)).
ToMaybe()));
}
Интересно, что SelectMany отрабатывает до collectionSelector и resultSelector.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>>> Я подправил потому, что изначальный смыл в том, что вычисления идут с права налево и нет лишних циклов если бы вычисляли слева направо c созданием новых коллекций
I>>Ты путаешь linq и ленивую обработку коллекций. Linq это про соответствующие расширения, которые можно навесить на любой интерфейс, а не только IEnumerable. Более того — совсем необязательно это будет коллекция. I>>RX, XML, WMI, IQueryable и тд и тд и тд.
Ты в любой момент можешь отказаться от вызова MoveNext, а следовательно, IEnumerable сам по себе ленивый, безо всякого yield.
Ты снова путаешь причину и следствие. yield это дешовый способ корректно генерировать IEnumerable. А раз это IEnumerable, то, следовательно, код будет ленивым.
Как по твоему реализовывали ленивые итерации до появления yield? Чудом, магией?
I>>Ты так пишешь.
S>И вот в конце наконец вызвать FirstOrDefault вот она вся прелесть вычислений справо на лево в отличие от твой позиции с вычислением слева направо
IEnumerable в АПИ подразумевает что перформанс не нужен, т.к. ты можешь понаобъединять сколько угодно фильтров-проекций.
Когда важен максимальный перформанс вычислений, в АПИ не должно быть никаких подобных интерфейсов.
Дальше я повыбрасывал твои куски кода, т.к. ты объясняешь прописные истины. yield я использовал еще с 2008го года. А ты пишешь, как будто лично ты его изобрёл и добавил в язык ажно вчера.
S>На yield построен Linq S>Непонятно?
Ты привел примеры частного случая. IQueryable гораздо лучше отражает Linq, нежели твой yield.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, Serginio1, Вы писали:
S>>>> Я подправил потому, что изначальный смыл в том, что вычисления идут с права налево и нет лишних циклов если бы вычисляли слева направо c созданием новых коллекций
I>>>Ты путаешь linq и ленивую обработку коллекций. Linq это про соответствующие расширения, которые можно навесить на любой интерфейс, а не только IEnumerable. Более того — совсем необязательно это будет коллекция. I>>>RX, XML, WMI, IQueryable и тд и тд и тд.
I>Судя по тому, что ты проигнорировал, ты или не понял, что здесь написано, или не согласен.
Ну вообщето говорим про IEnumerable, не про деревья выражений и IQueryable
I>>>Т.е. yield это частный случай для IEnumerable. То есть, частный случай частного случая
S>> Да но именно yield и создает IEnumerable ленивым. Посмотрим https://github.com/dotnet/runtime/blob/main/src/libraries/System.Linq/src/System/Linq/Where.cs
I> Ты в любой момент можешь отказаться от вызова MoveNext, а следовательно, IEnumerable сам по себе ленивый, безо всякого yield.
Да только нужно класс который генерит yield делат ручками. В Core для Where и Select так и сделали, но для других методов расширения оставили yield.
А во ыреймворке так и оставили.
I>Ты снова путаешь причину и следствие. yield это дешовый способ корректно генерировать IEnumerable. А раз это IEnumerable, то, следовательно, код будет ленивым.
Я как и говорю про дешевизну и легкость создания IEnumerable I>Как по твоему реализовывали ленивые итерации до появления yield? Чудом, магией?
Я уже тебе писал, что для Б+ деревьев сам писал итераторы я обхода дерева. I>>>Ты так пишешь.
S>>И вот в конце наконец вызвать FirstOrDefault вот она вся прелесть вычислений справо на лево в отличие от твой позиции с вычислением слева направо
I>IEnumerable в АПИ подразумевает что перформанс не нужен, т.к. ты можешь понаобъединять сколько угодно фильтров-проекций. I>Когда важен перформанс, в АПИ не должно быть никаких подобных интерфейсов.
I>Дальше я повыбрасывал твои куски кода, т.к. ты объясняешь прописные истины. yield я использовал еще с 2008го года. А ты пишешь, как будто лично ты его изобрёл и добавил в язык ажно вчера.
Я пишу про то, что yield повлиял на многое в качестве легкого создания итераторов в том числе и Linq и async/awaite.
Просто он как то стоит в сторонке S>>На yield построен Linq S>>Непонятно?
I>Ты привел примеры частного случая. IQueryable гораздо лучше отражает Linq, нежели твой yield.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, Serginio1, Вы писали:
S>>Спасибо Интересно не знал, что SQL синтаксис может работать не только с IEnumerable.
I> Теперь ясно, почему тебе мои аргументы непонятны.
Вот это как раз частный случай. Смотрим исходники Linq и смотрим количество yield.
В данном случае ленивости нет
и солнце б утром не вставало, когда бы не было меня
Re[24]: Есть ли подобие LINQ на других языках/платформах?
Здравствуйте, Serginio1, Вы писали:
I>>Судя по тому, что ты проигнорировал, ты или не понял, что здесь написано, или не согласен. S>Ну вообщето говорим про IEnumerable, не про деревья выражений и IQueryable
Linq в т.ч. IQueryable, а потому крайне странно сводить Linq к yield
I>> Ты в любой момент можешь отказаться от вызова MoveNext, а следовательно, IEnumerable сам по себе ленивый, безо всякого yield. S> Да только нужно класс который генерит yield делат ручками.
То есть, тебе понятно, что ленивость дает IEnumerable ?
S> Я как и говорю про дешевизну и легкость создания IEnumerable
Смотри сам — ты пишешь, что это это yield делает IEnumerable ленивым.
Да но именно yield и создает IEnumerable ленивым.
I>>Как по твоему реализовывали ленивые итерации до появления yield? Чудом, магией? S> Я уже тебе писал, что для Б+ деревьев сам писал итераторы я обхода дерева.
То есть, должно быть понятно, что yield это тот самый сахар, а не причина ленивости.
I>>Когда важен перформанс, в АПИ не должно быть никаких подобных интерфейсов.
I>>Дальше я повыбрасывал твои куски кода, т.к. ты объясняешь прописные истины. yield я использовал еще с 2008го года. А ты пишешь, как будто лично ты его изобрёл и добавил в язык ажно вчера. S>Я пишу про то, что yield повлиял на многое в качестве легкого создания итераторов в том числе и Linq и async/awaite.
yeild для Linq это всего лишь частный случай. Его полезность никак не отменяет издержек, проблем с ним и тд.
Такой вот дотнет целиком — приходится платить то тут, то там за определенные преимущества.
Re[26]: Есть ли подобие LINQ на других языках/платформах?
Здравствуйте, Serginio1, Вы писали:
S>>>Спасибо Интересно не знал, что SQL синтаксис может работать не только с IEnumerable.
I>> Теперь ясно, почему тебе мои аргументы непонятны. S>Вот это как раз частный случай. Смотрим исходники Linq и смотрим количество yield. S>В данном случае ленивости нет
Наоборот. IQueryable это гораздо более сильная ленивость, и гораздо ближе к идее Linq. И что интересно, безо всяких yield.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, Serginio1, Вы писали:
S>>Спасибо Интересно не знал, что SQL синтаксис может работать не только с IEnumerable.
I> Теперь ясно, почему тебе мои аргументы непонятны.
Нет непонятны ибо это частный случай, а во IEnumerable используется больше чем все остальные ветки Linq
и солнце б утром не вставало, когда бы не было меня
Re[25]: Есть ли подобие LINQ на других языках/платформах?
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, Serginio1, Вы писали:
I>>>Как по твоему реализовывали ленивые итерации до появления yield? Чудом, магией? S>> Я уже тебе писал, что для Б+ деревьев сам писал итераторы я обхода дерева.
I>То есть, должно быть понятно, что yield это тот самый сахар, а не причина ленивости.
Конечно, но этот сахар как раз и дает удобство для использования инумераторов. Тот же async\awaite тоже сахар и использется yield I>>>Когда важен перформанс, в АПИ не должно быть никаких подобных интерфейсов.
I>>>Дальше я повыбрасывал твои куски кода, т.к. ты объясняешь прописные истины. yield я использовал еще с 2008го года. А ты пишешь, как будто лично ты его изобрёл и добавил в язык ажно вчера. S>>Я пишу про то, что yield повлиял на многое в качестве легкого создания итераторов в том числе и Linq и async/awaite.
I>yeild для Linq это всего лишь частный случай. Его полезность никак не отменяет издержек, проблем с ним и тд.
I>Такой вот дотнет целиком — приходится платить то тут, то там за определенные преимущества.
Так и пиши на голом С. Однако ты же используешь и динамические языки
и солнце б утром не вставало, когда бы не было меня
Re[27]: Есть ли подобие LINQ на других языках/платформах?
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, Serginio1, Вы писали:
S>>>>Спасибо Интересно не знал, что SQL синтаксис может работать не только с IEnumerable.
I>>> Теперь ясно, почему тебе мои аргументы непонятны. S>>Вот это как раз частный случай. Смотрим исходники Linq и смотрим количество yield. S>>В данном случае ленивости нет
I>Наоборот. IQueryable это гораздо более сильная ленивость, и гораздо ближе к идее Linq. И что интересно, безо всяких yield.
Где я говорил про ленивость для IQueryable. Речь там шла совсем не про IQueryable. Там про то что
var n =
from c in 1.ToMaybe()
from s in"2".ToMaybe()
from x in 2.ToMaybe()
select s + c + x;
преобразуется в
var n = 1.ToMaybe().SelectMany(u => "2".ToMaybe(),
(c, s) => new { c, s })
.SelectMany(u => 2.ToMaybe(),
(t, x) => t.s + t.c + x);
и солнце б утром не вставало, когда бы не было меня