我为响应式扩展创建了一个SlidingWindow
操作符,因为我想轻松监控滚动平均值等内容。举个简单的例子,我想订阅听到鼠标事件,但每次有一个事件我想接收最后三个(而不是等待每第三个事件接收最后三个)。这就是为什么我发现的 Window 重载似乎没有给我开箱即用的东西。
这就是我想出的。鉴于其频繁的 List 操作,我担心它可能不是最高效的解决方案:
public static IObservable<List<T>> SlidingWindow<T>(this IObservable<T> seq, int length)
{
var seed = new List<T>();
Func<List<T>, T, List<T>> accumulator = (list, arg2) =>
{
list.Add(arg2);
if (list.Count > length)
list.RemoveRange(0, (list.Count - length));
return list;
};
return seq.Scan(seed, accumulator)
.Where(list => list.Count == length);
}
可以这样调用:
var rollingSequence = Observable.Range(1, 5).SlidingWindow().ToEnumerable();
然而,令我大吃一惊的是,并没有收到预期的结果
1,2,3
2,3,4
3,4,5
我收到结果
2,3,4
3,4,5
3,4,5
任何见解将不胜感激!