2017-02-27 90 views
1

我有一个IObservable<bool>,我希望在最后一个n项目设置为true时得到通知。订阅布尔状态使用Rx

对于像我想要的东西:

MyBool.Buffer(10).SelectMany(x => x).All(x => x).Subscribe(x => /*do something*/); 

但它只能触发一次;似乎OnCompleted被解雇了。

回答

3

您正在有效地缓冲和展平您的可观察值。调用.Buffer(10).SelectMany(x => x)就像是一种非手术,因为它发出的什么都去

你需要做的是更多这样的:

MyBool 
     .Buffer(10, 1) 
     .Select(xs => xs.All(x => x)) 
     .Where(x => x); 

我假设你想知道,每当有10个trues在排,如果有11个,你会得到两次通知。


背后Buffer(10, 1)的原因是这样Buffer作品 - 这给10元素的缓冲区,并沿着1移动。如果我做了Buffer(10),我会得到10个元素,然后移动十个元素。

如果我是Observable.Range(0, 5).Buffer(3)我得到{0, 1, 2}, {3, 4},但如果我做了Observable.Range(0, 5).Buffer(3, 1)我得到{0, 1, 2}, {1, 2, 3}, {2, 3, 4}, {3, 4}, {4}

如果你想知道当一个false来通后trues那就试试这个:

MyBool 
     .Buffer(3, 1) 
     .Select(xs => xs.All(x => x)) 
     .Buffer(2, 1) 
     .Where(x => x[0] || x[1]); 

这给了这些可能的组合:

results

+0

这实际工作,请你解释一下在缓冲区中跳过'1'有什么意义? – Sturm

+0

我现在正努力实现通知,当连续10个trues后MyBool设置为false时。我是否需要另一个IObservable并与当前的(MyBool')结合? – Sturm

+0

@Sturm - 我添加了更多细节。 – Enigmativity