2017-06-02 20 views
2

一定の間隔で値を生成するストリームを観察する必要がありますが、生成する10個の値ごとに1つの値をとるように値が大きすぎます。ObservableからN番目の要素をすべて取る

ことを行うには同等の、非RXの方法で、次のようになります。

int step = 10; // take every 10th value 
var numbers = Enumerable.Range(0, 100).Where((e, i) => i % step == 0); 

Rxの中でそれを行うための慣用的な方法でしょうか?

+3

あなたが同じ行うことができます: 'Observable.Range(0、100).Where((値、指数)=>インデックス%ステップ== 0) ' – Evk

+1

Rxでスロットルを使用することを検討してください。 http://www.introtorx.com/content/v1.0.10621.0/13_TimeShiftedSequences.html – MistyK

+0

@MistyK残念ながら、私の要素が定期的に到着しているので、Throttleはやっていないでしょう。 (IntervalやTimerのような)一定のレートで値を生成するシーケンスは、スロットル周期よりも速い値を生成した場合、またはそれらの値のすべてがスロットル時間よりも遅い値を生成した場合に伝播されます。」これは、Throttleが時間ベースであり、インデックスベース/カウントベースではないために発生します。 – heltonbiker

答えて

2

私はWhereBufferのいずれかを使用します。

int step = 10; // take every 10th value 

// Where 
var numbers = Observable.Range(0, 100).Where((e, i) => i % step == 0); 

// Buffer 
numbers = Observable.Range(0, 100).Buffer(step).Select(x => x[step - 1]); 
関連する問題