5

假设我写

var gen = Observable.Range(1, 3)
  .SelectMany(x => Observable.Range(1, x));

产生的序列1 1 2 1 2 3符合预期。但现在如果我写

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()进行某种多线程合并?

4

1 回答 1

8

Observable.Range()本身将始终按顺序生成其事件。然而SelectMany(),在开始下一个之前不要等待前一个 observable 完成。这意味着随着序列变得更长,将会有越来越多的重叠,因为下一个序列将在前一个序列完成之前开始,依此类推。

如果您试图让输出是连续的,那么您将需要使用不同的方法来展平序列,例如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() 等待每个序列完成。

于 2017-03-10T18:42:09.257 回答