6

SelectMany の動作は、生成された各値の結果を単一のストリームに効果的にマージすることであるため、順序付けは非決定論的であることを理解しています。

C# の RxJs で concatAll に似た処理を行うにはどうすればよいですか。

var obs = Observable.Range (1, 10).SelectMany (x => {
return Observable.Interval (TimeSpan.FromSeconds(10 - x)).Take (3);
}).Concat();

これは事実上、私がやりたいことです。範囲が与えられた場合、それぞれを少し待ってから、開始した順序で連結します。明らかにこれはおもちゃの例ですが、アイデアはそこにあります。

ブレア

4

1 に答える 1

6

Selectではなく、使用してくださいSelectMany。使用Concatするオーバーロードは で機能するIObservable<IObservable<T>>ため、単純に内部シーケンスを投影し、フラット化しないでください。

var obs = Observable.Range(1, 10)
                    .Select(x => Observable.Interval(TimeSpan.FromSeconds(10 - x)).Take(3))
                    .Concat();

それぞれのサブスクリプションは;Intervalを使用して延期されることに注意してください。Concatつまり、最初Intervalの間隔は購読するとすぐに開始されますが、残りの間隔はすべて生成され、購読なしでキューに入れられます。Concatすべてをサブスクライブしてから、後で正しい順序で値を再生するようなものではありません。

于 2014-10-10T13:59:14.343 に答える