对不起,这里有点新的RX.NET ......我已经能够在RX做很多事了,但不是我需要做的主要事情。
如果在过去的Y秒内收到X元素,我只希望observable弹出。换句话说,在任何时间点,当推送新元素时,回顾过去的X元素并查看它们是否都在过去的Y秒内发生。
我无法弄清楚"回头看看"部分。
由于滑动性,看起来Window会是正确的算子,但也许我对Window的定义有偏见。感觉就像我更接近的功能,但我还没有精灵。
答案 0 :(得分:2)
此函数将返回x
时间范围内的y
元素列表。
public static IObservable<IList<T>> GetFullWindows<T>(this IObservable<T> source, int x, TimeSpan y)
{
return source
.Publish(_obs => _obs
.Window(_obs, _ => Observable.Timer(y))
.SelectMany(window => window.Take(x).ToList())
.Where(l => l.Count == x)
);
}
这是一个用法示例:
var obs = Observable.Generate(0, i => i < 20, i => i + 1, i => i, i => TimeSpan.FromMilliseconds((20 - i) * 100));
var b = obs
.GetFullWindows(4, TimeSpan.FromSeconds(4.5));
b.Subscribe(l => l.Dump()); //using Linqpad
诀窍是使用Buffer
或Window
重叠窗口功能。 Window
在这里效果更好,因为如果您符合计数标准,就可以将其短路。