Здравствуйте, IB, Вы писали:
V>>Будь мужиком, скажи прямой речью: "я не понимаю, в чём заключается проблема в приведенном сниппете". IB>Так я тебе прямо сразу и сказал — ты пишешь полную хрень, которую невозможно понять.
Т.е., показанный сниппет ты так и не асилил.
ЧТД.
Попросил бы Синклера объяснить, если у других спросить стесняешься.
Здравствуйте, vdimas, Вы писали:
V>Но тело GetEnumerator() реализуется уже провайдером источника данных и почти всегда через нетривиальные преобразования над деревом выражений.
V>А в случае линка над IEnumerable подставляется уже готовое тело из расширений Enumerable (или своё готовое тело, как показал Синклер).
Прикладного программиста, который пишет лямбду как это затрагивает?
Здравствуйте, Sharov, Вы писали:
V>>Но тело GetEnumerator() реализуется уже провайдером источника данных и почти всегда через нетривиальные преобразования над деревом выражений. V>>А в случае линка над IEnumerable подставляется уже готовое тело из расширений Enumerable (или своё готовое тело, как показал Синклер). S> Прикладного программиста, который пишет лямбду как это затрагивает?
Здравствуйте, vdimas, Вы писали:
V>Попросил бы Синклера объяснить, если у других спросить стесняешься.
Ты опять свои пороки другим приписываешь. =)
Мне корона не жмет, я у тебя каждый раз спрашиваю что ты там себе на фантазировал, только ты что-то стесняешься признаться.
Вон, и в соседней ветке, один терпеливый коллега уже восьмое сообщение из тебя вытягивает о чем ты вообще, а ты все нырками уходишь — очень увлекательное зрелище.
Что характерно — о чем тебе говорят понятно, а что ты там себе придумал, загадочность и интрига... Не ломайся, не девочка. Или девочка? )
Здравствуйте, alex_public, Вы писали:
_>Совершенно верно. И вот когда на базе этих техник сделают аналог кода Синклера,
А с чего бы Антону делать аналог на базе таких техник? Этого в условиях задачи не было, техника не оговаривалась.
_> мы и сможем наконец то оценить эффективность Linq для данных задач.
Вот здесь линк не причем. Точнее причем, но только как одна из возможных реализаций. Условно говоря, использовать эти техники — это право, а не обязанность.
_>А вот привлекать код Синклера для целей оценки эффективности Linq — это просто смешно,т.к. от Linq там нет ничего.
От linq там все что надо, смешно, что вы этого не понимаете.
Здравствуйте, Sharov, Вы писали:
S>Здравствуйте, vdimas, Вы писали:
V>>Но тело GetEnumerator() реализуется уже провайдером источника данных и почти всегда через нетривиальные преобразования над деревом выражений.
V>>А в случае линка над IEnumerable подставляется уже готовое тело из расширений Enumerable (или своё готовое тело, как показал Синклер).
S> Прикладного программиста, который пишет лямбду как это затрагивает?
в одном случае (для Queryable) аргумент метода будет Expression<Func<TSource, TResult>> selector
а в другом Func<TSource, TResult> selector.
дак вот в 1-м, нужно явно прописать выражение тогда компилятор из него сформирует AST.
во 2-м можно подставить например статический метод который и реализует нужную логику и который может быть где-то ещё переиспользован, но не сможет быть переиспользован в 1-м. точнее может, но в этом случае в AST будет вызов этого метода, про который sql server естественно не знает.
Здравствуйте, vdimas, Вы писали:
I>>То есть, поскольку C# не умеет такую рекурсию иначе как через Y-комбинатор, следствием является отсутствие внятного реализации CTE.
V>C# умеет обычную рекурсию, этого достаточно.
У тебя не получается эту достаточность продемонстрировать.
I>>То есть, все просто — никто не хочет мучиться, выписывая непойми что.
V>А вот так нет: V>
V>Хотя видно, что вызова лямбды нет до окончания определения переменной.
Вот я могу такой код писать return source.Where(x=>SomeFilter(x)).Select(x=>SomeProjector(x))
Как твоим методом добавить сюда рекурсивные вызовы ? Не надо тянуть сюда Y-комбинатор, мы уже выяснили, что он плох.
V>Linq генерит теля лямбд. V>САМ! V>Хреново генерит. V>И так во многом в C#.
Может тебе определиться, откуда растут проблемы с рекурсей, из Линка или C#. У тебя, похоже, ответ от настроения зависит. Но если ты настаиваешь, что причины в C#, то я согласен и можно заканчивать.
V>Взять даже банальные IReadOnlyDictionary<>, IReadOnlyollection<>. V>Не прошло и 10-ти лет как выяснилось, что нужны были именно они в кач-ве интерфейсов, а не IDictionary и не ICollection, которые теперь как гиря на ногах.
Разумеется, все это время менялось понимание парадигдмы.
I>>То есть, тебе понятно, что причина не в LINQ, а в компиляторе ?
V>То есть ты ерунду продолжаешь говорить, сорри. V>Я уже всё показал, вроде бы.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, Sharov, Вы писали:
V>>>Копипастить всё-равно надо. S>>IQuerable наследует IEnumerable, если что.
V>Но тело GetEnumerator() реализуется уже провайдером источника данных и почти всегда через нетривиальные преобразования над деревом выражений.
V>А в случае линка над IEnumerable подставляется уже готовое тело из расширений Enumerable (или своё готовое тело, как показал Синклер).
Копипастить в итоге все равно нужно с умом ибо провайдер не все выражения понимает. Но как это относится к линку?
Linq для IEnumerable и для IQueryable остается линком.
Я могу применять запись запроса. Я этот вариант использую как для IEnumerable так и для IQueryable. https://docs.microsoft.com/ru-ru/dotnet/csharp/linq/write-linq-queries
а также смешанный. Например
var query2 = (from спр in бд.Спр_ДляПериодических
select new
{
Наименование = спр.Наименование,
ДатаСпр = спр.ДатаСпр,
Периодические = (from прериод in query.Where(х => х.OBJID == спр.ID && х.DATE <= спр.ДатаСпр).Take(1)
select new
{
Значение = прериод.VALUE,
Дата = прериод.DATE
}).FirstOrDefault()
}
);
Просто нужно различать Linq для IQuerable и для IEnumerable. Там синтаксис другой.
Больше интерес представляет использование Линка для IQueryable для разных провайдеров. А там копипастить не нужно.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Ikemefula, Вы писали:
I>>>То есть, поскольку C# не умеет такую рекурсию иначе как через Y-комбинатор, следствием является отсутствие внятного реализации CTE. V>>C# умеет обычную рекурсию, этого достаточно. I>У тебя не получается эту достаточность продемонстрировать.
I>Вот я могу такой код писать return source.Where(x=>SomeFilter(x)).Select(x=>SomeProjector(x)) I>Как твоим методом добавить сюда рекурсивные вызовы ?
Точно так же:
static bool RecursiveFilter(IEnumerable<int> values, int value, int index)
{
var enumerator = values.GetEnumerator();
for (int i = 0; i < index - 1; i++)
{
enumerator.MoveNext();
if (enumerator.Current == value)
return false;
}
return true;
}
static void RecursionTest()
{
int[] source = new int[] { 1, 3, 1, 2, 3, 1, 3, 2, 1 };
IEnumerable<int> func = null;
func = source.Where((x, index) => RecursiveFilter(func, x, index));
foreach(var i in func)
Console.WriteLine(i);
}
Первый раз показал по обычной ф-ии, теперь по последовательностям.
Здесь прямо в момент генерации этой последовательности прямо по ней же происходит поиск дубликатов в духе маляра Шлемиэля.
Выведет:
1
3
2
I> Может тебе определиться, откуда растут проблемы с рекурсей, из Линка или C#. У тебя, похоже, ответ от настроения зависит.
Похоже, ты тщательно стараешься не быть объективным. ))
ОК, пусть даже мы хотим избежать серьёзного изменения в языке C# по историческим причинам.
Но в линке-то появилось выражение let x = some_expression.
Из этого выражения генерится примерно такое тело делегата:
...
var x = some_expression(other_variables);
...
Вопрос:
что помешало сделать так:
...
var x = default;
x = some_expression(other_variables);
...
и разрешить рекурсию прямо в выражениях?
V>>Взять даже банальные IReadOnlyDictionary<>, IReadOnlyollection<>. V>>Не прошло и 10-ти лет как выяснилось, что нужны были именно они в кач-ве интерфейсов, а не IDictionary и не ICollection, которые теперь как гиря на ногах. I>Разумеется, все это время менялось понимание парадигдмы.
Парадигма не поменялась.
Но именно интерфейсы оказались нужны только для перебора коллекции, а не для записи туда значений.
Причём, в обычном коде тоже, не только в линке.
...
var x = default;
x = some_expression(other_variables);
...
и разрешить рекурсию прямо в выражениях?
Через такую-то мать можно дотолкать:
class Box<T> { public T value; }
static Box<IEnumerable<T>> trick<T>() => new Box<IEnumerable<T>>();
static IEnumerable<T> fuck_the_system<T>(Box<IEnumerable<T>> trick, IEnumerable<T> en) {
trick.value = en;
return en;
}
static void RecursionTest()
{
int[] source = new int[] { 1, 3, 1, 2, 3, 1, 3, 2, 1 };
var y = from _ in new int[1]
let trick = trick<int>()
let func = fuck_the_system(trick, source.Where((x, index) => RecursiveFilter(trick.value, x, index)))
from c in func
select c;
foreach (var x in y)
Console.WriteLine(x);
}
Список костылей: from _ in new int[1] — выражение не может начинаться с let, поэтому делаем "фиктивный" цикл верхнего уровня; let trick = trick<int>() — присваиваем переменной не само значение, а адрес другой (целевой) переменной; fuck_the_system — присваиваем значение целевой переменной.
Здравствуйте, IB, Вы писали:
V>>Попросил бы Синклера объяснить, если у других спросить стесняешься. IB>Ты опять свои пороки другим приписываешь. =) IB>Мне корона не жмет,
И что помешало спросить у Синклера, если не жмёт?
IB>я у тебя каждый раз спрашиваю что ты там себе на фантазировал, только ты что-то стесняешься признаться.
А-а-а.
ОК, понял!
Т.е. это язык такой.
Все эти твои фразы:
"ты пишешь какой-то бред"
"я только что прочитал какие-то потёки сознания"
"ты себе что-то не то нафантазировал"
И т.д. и т.п.
— их надо читать не как утверждения, а как просьбу: "объясните, пожалуйста, а то я недопонял".
Ну, блин, Семён Семёныч, а что же ты раньше молчал-то?
IB>Вон, и в соседней ветке, один терпеливый коллега уже восьмое сообщение из тебя вытягивает о чем ты вообще, а ты все нырками уходишь — очень увлекательное зрелище.
Я не до конца понимаю, что ему не понятно, а он сам колоться не желает, хотя я его и подталкиваю.
Вот ему ответили: http://www.rsdn.org/forum/dotnet/7199651.1
ХЗ, может именно это было не понятно, я не доктор.
IB>Что характерно — о чем тебе говорят понятно, а что ты там себе придумал, загадочность и интрига...
Как много слов вместо простого твоего признания "простите, но я ни хрена не понимаю!"
RTFM до просветления!
И да, спроси, таки, у Синклера, в чём там подвох.
Похоже, ты не взял себе за труд вникнуть в его решение, т.е. мне надо будет тебе сейчас его объяснять с 0-ля, с самого первого поста.
Пусть это сделает автор решения.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, Serginio1, Вы писали:
S>>А внутри может быть все по разному. Как я уже давал ссылку https://github.com/antiufo/roslyn-linq-rewrite вплоть до компиляции в CIL.
V>Может, ес-но. V>Непонятно лишь, почему такое преобразование не делается самим компилятором C# еще с первых версий Linq. V>В С++ с выходом лямб они сразу же умели инлайниться компилятором.
Ну и насколько позже они в C++ появились? Да и линка для кверябчя там нет и синтаксиса запросов.
При этом не все можно проинлайнить кода приходит в параметрах Func<типПараметра, типРезультата>
С развитием Рослина обещают в дальнейшем раширить компиляцию по аналогии с Fody
S>> А как это реализовано это другой вопрос. Запрос к БД или сгенерированный запрос в IL не перестал быть линком. Или ты для этого другое название придумаешь?
V>Что и для чего ты пытаешься спросить?
Я тебя поправляю. Linq он и для IQuriable и для IEnumerable Linq. Просто используется перегрузка операторов.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, Serginio1, Вы писали:
S>>Я тебя поправляю. Linq он и для IQuriable и для IEnumerable Linq.
V>В чём суть поправки?
Ты говорил, что Linq для кврябля это не линк.
От тот же Linq только в параметрах не делегаты а System.Linq.Expressions и в зависимости от типа применяется перегрузка операторов.
Сам же линк никуда не девался.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>>>Я тебя поправляю. Linq он и для IQuriable и для IEnumerable Linq. V>>В чём суть поправки? S> Ты говорил, что Linq для кврябля это не линк.
Можно мои дословные фразы?
S>От тот же Linq только в параметрах не делегаты а System.Linq.Expressions и в зависимости от типа применяется перегрузка операторов. S>Сам же линк никуда не девался.
Всё же, мне сложно отвечать на предложения, посмотренные в форме возражений, когда они не являются возражением к моим утверждениям.