对不起,这里是rx.net的新手...我能够在RX中做很多事情,但我不需要做的主要工作。
我只希望在过去的y秒内收到x元素时,才希望它能弹出。换句话说,在任何时间点,当推动新元素时,回顾过去的X元素,看看它们是否都发生在过去的y秒内。
我无法弄清楚"回头和计数"部分。
由于滑动性,窗口似乎是正确的操作员,但也许我对窗口的定义有偏见。感觉就像我要做的那样近的功能,但我还不是向导。
此功能将返回属于 y
timespan中的 x
元素列表。
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
在这里工作得更好,因为如果您符合计数标准,则可以短路。