Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, Serginio1, Вы писали:
I>>>Ты пока не показал, как xml, db и подобные вещи читать твоим IEnumerable, что бы это было максимально эффективно.
S>> Ты чего издеваешься!!! Я тебе ссылку на Linq to XML давал!!!!!
I>Ты пишешь "Xml там IQueryable на самом то деле. ". Смотри сам http://rsdn.org/forum/flame.comp/7994997.1Автор: Serginio1
Дата: 21.04.21
I>Я не ходил по ссылке, поверил тебе на слово.
I>Похоже, судя по твоим воплям, ты снова написал не то, что думал?
Я тебе исходники давал
https://github.com/Microsoft/referencesource/blob/master/System.Xml.Linq/System/Xml/Linq/XLinq.cs#L1457
Но ты не читатель!!!!!
I>>>В JS, раз уж ты вспомнил, есть yield. Однако же, в RX процессинг ленивый, а обходятся без yield
I>>>https://github.com/ReactiveX/rxjs/search?q=yield
I>>>Ажно 11 раз, и те в документации и тестах
I>>>Теперь тебе понятно, что yield для RX это вещь сильно опциональная?
S>> Еще раз писать ленивые итераторы это ручная работа того, что делает yield.
I>Очевидно — нет. Ты просто не в курсе, как это делается в RX.
I>Еще раз:
I>Вместо yield a пишем observer.next(a)
Приведи реальный код. Заметь я тебе даю кучу ссылок но ты их и не читаешь и дальше плетешь всякую хрень.
https://docs.microsoft.com/en-us/archive/msdn-magazine/2017/june/essential-net-custom-iterators-with-yield
То есть такой код.
public System.Collections.Generic.IEnumerable<T>
GetNotNullEnumerator()
{
if((First == null) || (Second == null))
{
yield break;
}
yield return Second;
yield return First;
}
преобразуется в
public class Pair<T> : IPair<T>, IEnumerable<T>
{
// ...
// The iterator is expanded into the following
// code by the compiler.
public virtual IEnumerator<T> GetEnumerator()
{
__ListEnumerator result = new __ListEnumerator(0);
result._Pair = this;
return result;
}
public virtual System.Collections.IEnumerator
System.Collections.IEnumerable.GetEnumerator()
{
return new GetEnumerator();
}
private sealed class __ListEnumerator<T> : IEnumerator<T>
{
public __ListEnumerator(int itemCount)
{
_ItemCount = itemCount;
}
Pair<T> _Pair;
T _Current;
int _ItemCount;
public object Current
{
get
{
return _Current;
}
}
public bool MoveNext()
{
switch (_ItemCount)
{
case 0:
_Current = _Pair.First;
_ItemCount++;
return true;
case 1:
_Current = _Pair.Second;
_ItemCount++;
return true;
default:
return false;
}
}
}
}
Покажи во что это преобразуется в observer.next(a)
I>На сколько я понимаю, C# эквивалент это что то навроде AsyncObservableBase
I>https://github.com/dotnet/reactive/blob/9f2a8090cea4bf931d4ac3ad071f4df147f4df50/AsyncRx.NET/System.Reactive.Async.Core/System/Reactive/AsyncObservableBase.cs
RX это обработка асинхронных очередей достаточно просто решается через IAsyncEnumerable
https://github.com/dotnet/reactive/blob/9f2a8090cea4bf931d4ac3ad071f4df147f4df50/Ix.NET/Source/System.Linq.Async/System/Linq/Operators/TakeWhile.cs
https://habr.com/ru/company/otus/blog/514594/
Заметь как элеганто решается с помощью yield
I>Это не важно, что от чего наследуется. При помощи IQueryable можно сделать всё, добавляя провайдер.
I>С IEnumerable так не получится.
То есть минус ты мне поставил за то, что IEnumerable так не может при работе с БД, поэтому yield отстой и он не нужен и без него Linq и без него линк прекрасно обходится!
За что минус!!!!