Window和SelectMany中的直观解释

时间:2016-11-23 10:29:53

标签: c# system.reactive

我想了解以下结合windowSelectMany的示例。据我所知Window IObservable一旦IObservable<IObservable<T>>开始发送项目,就会创建Observable流(SelectMany)。此流已展平为<IObservable<T>以获得SelectMany

video tutorial中使用IObservable时,在简单的f中创建一个新流(假设为“线程”),其中应用了函数SelectMany

问题:

  1. 请您详细说明数据如何到达订阅中,以及根据视频教程marble diagram是什么?
  2. 用于展平流的功能究竟是什么?
  3. 最后,是否有可能提供一个更复杂的例子,其中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(); ,以及如何在大理石图中描绘结果?
  4. 谢谢。

    android:columnOrderPreserved="false"

1 个答案:

答案 0 :(得分: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>对象。 Rx中的.SelectMany(selector)几乎相当于.Select(selector).Merge()。因此,如果您有SelectMany(o => o)电话,就像您的情况一样,这与Merge电话相同。

在我们的案例中,Window正在返回IObservable<IObservable<long>>,因此TSource的类型为IObservable<long>。选择器函数返回IObservable<long>,因此TResultlong

这是一个使用Range的示例:选择器将返回看起来像{0},{0,1},{0,1,2},{0,1,2,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));