Сообщение 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>
Спасибо Интересно не знал, что SQL синтаксис может работать не только с IEnumerable.
И прикольно смотреть как действуют collectionSelector и resultSelector
И в 2008 работает! Вот так век живи и век учись!!!
Ну для меня запись типа намного более читаема
чем
Все достаточно просто, если выразить через методы расширения
Спасибо! Все таки зашоренное мышление немного приоткрыть.
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>
Спасибо Интересно не знал, что SQL синтаксис может работать не только с IEnumerable.
И прикольно смотреть как действуют collectionSelector и resultSelector
И в 2008 работает! Вот так век живи и век учись!!!
Ну для меня запись типа намного более читаема
чем
Все достаточно просто, если выразить через методы расширения
Спасибо! Все таки зашоренное мышление немного приоткрыть.
посмотрел как отрабатывают SelectMany и collectionSelector и resultSelector
Интересно, что SelectMany отрабатывает до collectionSelector и resultSelector.
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.