Re[18]: Есть ли подобие LINQ на других языках/платформах?
От: rameel https://github.com/rsdn/CodeJam
Дата: 19.04.21 13:03
Оценка:
Здравствуйте, 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 на других языках/платформах?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.04.21 13:20
Оценка:
Здравствуйте, Serginio1, Вы писали:


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 на других языках/платформах?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.04.21 13:23
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>>>Прошедшее это какое? В 2008 там его не было, а код был стар на тот момент, как говно мамонта.

I>>.net 3.5, т.е. c linq, вышел в конце 2007го года. Вероятно, в 2008 еще не успели натаскать, а вот примерно к 2009..2011му постарались

НС>До 2010 там точно никакого линка не было.


Я привел dotMemory 64 потому как это был последний мой продакшн опыт с дотнетом — я год сидел в профайлерах, а dotMemory 64 был только early access. Я его поюзал неделю и выбросил. Выясни, когда брейнсы сделали первый релиз и сузим диапазон до года-двух

I>>Собственно, эта штука обсуждалась на сколько помню на рсдн. Лень искать.


НС>Обсуждалась на рсдн другая история, не про форматтер. В форматтере линка никогда не было.


А что, по твоему, обсуждалось на РСДН?
Re[19]: Есть ли подобие LINQ на других языках/платформах?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.04.21 13:27
Оценка:
Здравствуйте, rameel, Вы писали:

R>Здравствуйте, Serginio1, Вы писали:


S>> Да можно оптимизировать и инлайнить, но мало кому это нужно.


R>Вообще-то много кому нужно и много где нужно, так как линк действительно порой может сильно повысить читаемость и наглядность кода.


S>> Я тебе приводил примеры на оптимизацию Linq https://mattwarren.org/2016/09/29/Optimising-LINQ/

S>>И поверь мало кто ими пользуются.

R>Мало им пользуются, потому что не ясна его поддержка, и последнее обновление 3 года назад тому подтверждение.

Если бы реально была нужна, то завалили бы предложениями, однако это не так.
Учитывая развите Sourse generator то можно и там развернуться.
и солнце б утром не вставало, когда бы не было меня
Re[19]: Есть ли подобие LINQ на других языках/платформах?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.04.21 13:37
Оценка:
Здравствуйте, 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 в цепочке расширений если вычисления идут слева направо.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 19.04.2021 13:41 Serginio1 . Предыдущая версия . Еще …
Отредактировано 19.04.2021 13:39 Serginio1 . Предыдущая версия .
Re[9]: Есть ли подобие LINQ на других языках/платформах?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.04.21 13:45
Оценка:
Здравствуйте, Danchik, Вы писали:

Можешь привести аргументацию минуса http://rsdn.org/forum/dotnet/7989105.1
Автор: Serginio1
Дата: 13.04.21

Мне интересно, в чем я заблуждаюсь
и солнце б утром не вставало, когда бы не было меня
Re[20]: Есть ли подобие LINQ на других языках/платформах?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.04.21 14:18
Оценка:
Здравствуйте, 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 в цепочке расширений если вычисления идут слева направо.


Это тот самый частный случай.
Отредактировано 19.04.2021 14:21 Pauel . Предыдущая версия .
Re[21]: Есть ли подобие LINQ на других языках/платформах?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.04.21 15:10
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, Serginio1, Вы писали:


I>>>И что? Сколько стоит использование IEnumerable ?

S>> То же что и yield, а именно MoveNext и Current

I>Именно.


S>> Я подправил потому, что изначальный смыл в том, что вычисления идут с права налево и нет лишних циклов если бы вычисляли слева направо c созданием новых коллекций


I>Ты путаешь linq и ленивую обработку коллекций. Linq это про соответствующие расширения, которые можно навесить на любой интерфейс, а не только IEnumerable. Более того — совсем необязательно это будет коллекция.

I>RX, XML, WMI, IQueryable и тд и тд и тд.

I>Т.е. yield это частный случай для IEnumerable. То есть, частный случай частного случая


Да но именно yield и создает IEnumerable ленивым. Посмотрим https://github.com/dotnet/runtime/blob/main/src/libraries/System.Linq/src/System/Linq/Where.cs
Или
https://referencesource.microsoft.com/#system.core/system/linq/Enumerable.cs

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;
            }


Кстати еще раз посмотрел исходники они заккоментировали
 //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");
        //    return WhereIterator<TSource>(source, predicate);
        //}
 
        //static IEnumerable<TSource> WhereIterator<TSource>(IEnumerable<TSource> source, Func<TSource, bool> predicate) {
        //    foreach (TSource element in source) {
        //        if (predicate(element)) yield return element;
        //    }
        //}

И заменили их классами наследующие abstract class Iterator<TSource> : IEnumerable<TSource>, IEnumerator<TSource> которые по сути генерит yield при компиляции. Но в остальном методы используют yield.

На yield построен Linq
Непонятно?
и солнце б утром не вставало, когда бы не было меня
Отредактировано 19.04.2021 15:47 Serginio1 . Предыдущая версия . Еще …
Отредактировано 19.04.2021 15:30 Serginio1 . Предыдущая версия .
Отредактировано 19.04.2021 15:22 Serginio1 . Предыдущая версия .
Re[22]: Есть ли подобие LINQ на других языках/платформах?
От: IT Россия linq2db.com
Дата: 19.04.21 17:12
Оценка: 3 (1)
Здравствуйте, 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 на других языках/платформах?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.04.21 18:26
Оценка: :)
Здравствуйте, 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.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 20.04.2021 11:14 Serginio1 . Предыдущая версия . Еще …
Отредактировано 20.04.2021 0:06 Serginio1 . Предыдущая версия .
Отредактировано 19.04.2021 21:54 Serginio1 . Предыдущая версия .
Отредактировано 19.04.2021 18:34 Serginio1 . Предыдущая версия .
Re[6]: Есть ли подобие LINQ на других языках/платформах?
От: Artem Korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 19.04.21 18:55
Оценка:
Здравствуйте, zverjuga, Вы писали:

Z>на том же Swift/F# синтаксис функциональщины намного приятнее, чем на сишарпе.


Со swift'ом не знаком, но речь вроде о LINQ, а не о функциональщине.
С уважением, Artem Korneev.
Re[22]: Есть ли подобие LINQ на других языках/платформах?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.04.21 07:02
Оценка: +1
Здравствуйте, Serginio1, Вы писали:

S>>> Я подправил потому, что изначальный смыл в том, что вычисления идут с права налево и нет лишних циклов если бы вычисляли слева направо c созданием новых коллекций


I>>Ты путаешь linq и ленивую обработку коллекций. Linq это про соответствующие расширения, которые можно навесить на любой интерфейс, а не только IEnumerable. Более того — совсем необязательно это будет коллекция.

I>>RX, XML, WMI, IQueryable и тд и тд и тд.

Судя по тому, что ты проигнорировал, ты или не понял, что здесь написано, или не согласен.

I>>Т.е. yield это частный случай для IEnumerable. То есть, частный случай частного случая


S> Да но именно yield и создает IEnumerable ленивым. Посмотрим https://github.com/dotnet/runtime/blob/main/src/libraries/System.Linq/src/System/Linq/Where.cs


Ты в любой момент можешь отказаться от вызова MoveNext, а следовательно, IEnumerable сам по себе ленивый, безо всякого yield.

Ты снова путаешь причину и следствие. yield это дешовый способ корректно генерировать IEnumerable. А раз это IEnumerable, то, следовательно, код будет ленивым.

Как по твоему реализовывали ленивые итерации до появления yield? Чудом, магией?

I>>Ты так пишешь.


S>И вот в конце наконец вызвать FirstOrDefault вот она вся прелесть вычислений справо на лево в отличие от твой позиции с вычислением слева направо


IEnumerable в АПИ подразумевает что перформанс не нужен, т.к. ты можешь понаобъединять сколько угодно фильтров-проекций.
Когда важен максимальный перформанс вычислений, в АПИ не должно быть никаких подобных интерфейсов.

Дальше я повыбрасывал твои куски кода, т.к. ты объясняешь прописные истины. yield я использовал еще с 2008го года. А ты пишешь, как будто лично ты его изобрёл и добавил в язык ажно вчера.

S>На yield построен Linq

S>Непонятно?

Ты привел примеры частного случая. IQueryable гораздо лучше отражает Linq, нежели твой yield.
Отредактировано 20.04.2021 7:13 Pauel . Предыдущая версия .
Re[24]: Есть ли подобие LINQ на других языках/платформах?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.04.21 07:04
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Спасибо Интересно не знал, что SQL синтаксис может работать не только с IEnumerable.


Теперь ясно, почему тебе мои аргументы непонятны.
Re[23]: Есть ли подобие LINQ на других языках/платформах?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.04.21 07:17
Оценка:
Здравствуйте, 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.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 20.04.2021 11:12 Serginio1 . Предыдущая версия . Еще …
Отредактировано 20.04.2021 7:21 Serginio1 . Предыдущая версия .
Re[25]: Есть ли подобие LINQ на других языках/платформах?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.04.21 07:18
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, Serginio1, Вы писали:


S>>Спасибо Интересно не знал, что SQL синтаксис может работать не только с IEnumerable.


I> Теперь ясно, почему тебе мои аргументы непонятны.

Вот это как раз частный случай. Смотрим исходники Linq и смотрим количество yield.
В данном случае ленивости нет
и солнце б утром не вставало, когда бы не было меня
Re[24]: Есть ли подобие LINQ на других языках/платформах?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.04.21 07:42
Оценка:
Здравствуйте, 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 на других языках/платформах?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.04.21 07:46
Оценка: +1
Здравствуйте, Serginio1, Вы писали:

S>>>Спасибо Интересно не знал, что SQL синтаксис может работать не только с IEnumerable.


I>> Теперь ясно, почему тебе мои аргументы непонятны.

S>Вот это как раз частный случай. Смотрим исходники Linq и смотрим количество yield.
S>В данном случае ленивости нет

Наоборот. IQueryable это гораздо более сильная ленивость, и гораздо ближе к идее Linq. И что интересно, безо всяких yield.
Отредактировано 20.04.2021 7:47 Pauel . Предыдущая версия .
Re[25]: Есть ли подобие LINQ на других языках/платформах?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.04.21 07:51
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, Serginio1, Вы писали:


S>>Спасибо Интересно не знал, что SQL синтаксис может работать не только с IEnumerable.


I> Теперь ясно, почему тебе мои аргументы непонятны.

Нет непонятны ибо это частный случай, а во IEnumerable используется больше чем все остальные ветки Linq
и солнце б утром не вставало, когда бы не было меня
Re[25]: Есть ли подобие LINQ на других языках/платформах?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.04.21 11:10
Оценка:
Здравствуйте, 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 на других языках/платформах?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.04.21 11:16
Оценка:
Здравствуйте, 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);
и солнце б утром не вставало, когда бы не было меня
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.