我有一个IObservable<bool>
,我希望在最后n
项设置为true时收到通知。
为此,我正在尝试这样的事情:
MyBool.Buffer(10).SelectMany(x => x).All(x => x).Subscribe(x => /*do something*/);
但它只发射一次;似乎OnCompleted
以某种方式被解雇了。
答案 0 :(得分:3)
你有效地缓冲和压扁你的观察力。调用.Buffer(10).SelectMany(x => x)
就像是一个非操作,因为它发出了所有内容。
你需要做的更像是这样:
MyBool
.Buffer(10, 1)
.Select(xs => xs.All(x => x))
.Where(x => x);
我假设你想知道连续10个真相,所以如果有11个,你会被告知两次。
Buffer(10, 1)
背后的原因是Buffer
的工作方式 - 这会提供10
元素的缓冲区,并按1
移动。如果我做Buffer(10)
,我会得到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]);
何时到达,请尝试以下操作:
GloablaRNG
这给出了这些可能的组合: