2017-06-02 115 views
2

我需要觀察一個以固定間隔產生值的流,但是值太多了,所以我想對每產生十個值說一個值。從Observable中獲取每個第N個元素

相當於非RX的方式來做到這一點,將是:

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

什麼是慣用的方式做,在接收?

+3

可以做同樣的:'Observable.Range(0,100)。凡((值,指數)=>指數%步驟== 0) ' – Evk

+1

考慮在Rx中使用油門。 http://www.introtorx.com/content/v1.0.10621.0/13_TimeShiftedSequences.html – MistyK

+0

@MistyK不幸的是Throttle不會這樣做,因爲我的元素定期到達,並根據文檔_「Throttle方法是唯一的對於產生可變速率值的序列很有用,以恆定速率產生值的序列(如Interval或Timer),如果它們產生的值比節流期更快,或者它們的所有值都是如果產生的值比節流時間段慢,就會傳播。「_這是因爲節流閥是基於時間的,而不是基於索引/基於計數的。 – 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]);