假设我写
var gen = Observable.Range(1, 3)
.SelectMany(x => Observable.Range(1, x));
所产生的序列如预期的。但是现在我写
var gen = Observable.Range(1, 4)
.SelectMany(x => Observable.Range(1, x));
现在产生的序列是1 1 2 1 2 1 3 2 3 4
,而不是人们期望的1 1 2 1 2 3 1 2 3 4
。这是为什么?SelectMany()
是否进行某种多线程合并?
Observable.Range()
本身将始终按顺序生成其事件。但是,SelectMany()
在启动下一个之前,CC_6不会等待先前的可观察到完成。这意味着,随着序列的延长,将越来越多的重叠,因为下一个序列将在上一个序列完成之前开始。
如果您试图使输出保持顺序,那么您将需要使用不同的方式来扁平序列,例如Concat()
。
例如:
var gen = Observable.Range(1, 4)
.Select(x => Observable.Range(1, x)).Concat();
输出:1,1,2,1,2,3,1,2,3,4
与 SelectMany()
不同, Concat()
dis 等待每个序列在启动下一个序列之前完成。