2016-11-23 1 views
-1

Я пытаюсь понять следующий пример, который объединяет и SelectMany. Насколько мне известно, Window создает поток IObservable (IObservable<IObservable<T>>), как только Observable начинает отправлять товары. Этот поток сглаживается с SelectMany, чтобы получить <IObservable<T>.Интуитивное объяснение в Window и SelectMany

В этом video tutorial при использовании SelectMany в простом IObservable, создается новый поток (пусть говорят «нить»), где функция f является applyied.

Вопросы:

  1. Не могли бы вы, пролить свет, о том, как пришли данные в подписку и то, что в соответствии с видео Учебник marble diagram?
  2. Что такое функция, которая применяется для выравнивания потока?
  3. Наконец, можно ли представить более сложный пример, в котором SelectMany применяет простую функцию, например Range, и как результаты отображаются на мраморной диаграмме?

спасибо.

var source = Observable.Interval(TimeSpan.FromMilliseconds(100))// start a counter from zero and last 100 milliseconds 
     .Take(5) // take only the first 5 items 
     .Window(2) 
     .SelectMany(c => c); 

source.Subscribe(
    value => Console.WriteLine(value.ToString()), 
    error => Console.WriteLine(error.Message), 
    () => Console.WriteLine("Completed") 
); 

Console.WriteLine("Press any key to exit"); 
Console.ReadKey(); 
+2

«что именно функция, которая применяется для выравнивания поток?" - Um, 'SelectMany'. Но столбы переполнения стека должны действительно иметь * один * конкретный вопрос в ... на данный момент этот пост является слишком широким и неясным относительно того, какую часть вы не понимаете. Вы понимаете 'SelectMany' в« регулярном »LINQ? Вы должны иметь возможность применить это знание здесь, и если вы этого не сделаете, я предлагаю, чтобы вы начали. –

ответ

1

мраморная диаграмма для каждого шага выше коды выглядит следующим образом:

interval: 0----1----2----3----4----5----6----7---- 
take5 : 0----1----2----3----4| 
window : W1--------W2--------W3| 
window1: 0----1| 
window2:   2----3| 
window3:      4| 
slctmny : 0----1----2----3----4| 

SelectMany принимает наблюдаемый типа TSource, и функция выбора, которая преобразует одну TSource объекта в IObservable<TResult> объекта , Он применяет селекторную функцию ко всем входам, производя IObservable<IObservable<TResult>>, затем сглаживает (объединяет) один объект IObservable<TResult>. .SelectMany(selector) в Rx в значительной степени эквивалентен .Select(selector).Merge(). Поэтому, если у вас есть звонок SelectMany(o => o), как и ваш случай, это то же самое, что и звонок Merge.

В нашем случае Window возвращает IObservable<IObservable<long>>, поэтому TSource - тип IObservable<long>. Функция выбора возвращает IObservable<long>, поэтому TResult - long.

Вот пример использования Range: Селектор вернет наблюдаемые, которые выглядят как {0}, {0, 1}, {0, 1, 2}, {0, 1, 2, 3} и т. Д., Но SelectMany разглаживает ее, так что вы получите один наблюдаемым: {0, 0, 1, 0, 1, 2, 0, 1, 2, 3 ...}

var source = Observable.Interval(TimeSpan.FromMilliseconds(100))// start a counter from zero and last 100 milliseconds 
     .Take(5) // take only the first 5 items 
     .SelectMany(l => Observable.Range(0, (int)l)); 
Смежные вопросы