Информация об изменениях

Сообщение Re[23]: Есть ли подобие LINQ на других языках/платформах? от 19.04.2021 18:26

Изменено 20.04.2021 11:14 Serginio1

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


Спасибо! Все таки зашоренное мышление немного приоткрыть.
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.