我想了解以下结合window
和SelectMany
的示例。据我所知Window
IObservable
一旦IObservable<IObservable<T>>
开始发送项目,就会创建Observable
流(SelectMany
)。此流已展平为<IObservable<T>
以获得SelectMany
。
在video tutorial中使用IObservable
时,在简单的f
中创建一个新流(假设为“线程”),其中应用了函数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();
,以及如何在大理石图中描绘结果?谢谢。
android:columnOrderPreserved="false"
答案 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>
,因此TResult
为long
。
这是一个使用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));