如果X元素在过去的Y秒内弹出?

时间:2017-06-05 20:29:08

标签: c# system.reactive

对不起,这里有点新的RX.NET ......我已经能够在RX做很多事了,但不是我需要做的主要事情。

如果在过去的Y秒内收到X元素,我只希望observable弹出。换句话说,在任何时间点,当推送新元素时,回顾过去的X元素并查看它们是否都在过去的Y秒内发生。

我无法弄清楚"回头看看"部分。

由于滑动性,看起来Window会是正确的算子,但也许我对Window的定义有偏见。感觉就像我更接近的功能,但我还没有精灵。

1 个答案:

答案 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

诀窍是使用BufferWindow重叠窗口功能。 Window在这里效果更好,因为如果您符合计数标准,就可以将其短路。

相关问题