2017-06-02 113 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]);