c# - 在 Rx 中实现滑动窗口的问题

标签 c# system.reactive rx.net

我创建了一个 SlidingWindow用于响应式(Reactive)扩展的运算符,因为我想轻松地监视滚动平均值等内容。举个简单的例子,我想订阅收听鼠标事件,但每次有一个事件时,我想接收最后三个(而不是等待每个事件)第三个事件接收最后三个)。这就是为什么我发现的 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

任何见解将不胜感激!

最佳答案

使用原始测试,计数参数为 3,这给出了所需的结果:

public static IObservable<IList<T>> SlidingWindow<T>(
    this IObservable<T> source, int count)
{
    return source.Buffer(count, 1)
                 .Where(list => list.Count == count);
}

像这样测试:
var source = Observable.Range(1, 5);
var query = source.SlidingWindow(3);
using (query.Subscribe(i => Console.WriteLine(string.Join(",", i))))
{

}

输出:
1,2,3
2,3,4
3,4,5

关于c# - 在 Rx 中实现滑动窗口的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15256557/

相关文章:

c# - ADO.NET 连接导致实例失败

c# - ajax calendar extender - 自定义高度导致 View 重叠

.net - Rx : Are observables "repeatable" like IEnumerable,,如果没有,这段代码是如何工作的?

c# - 是否可以向 Rx.Net Timeout 运算符添加自定义消息

c# - 从定期异步请求创建可观察对象

c# - 从 C# 中的字符串命名实例

c# - 如何在 WinForms 项目中将 XML 用作 DataGridView 的数据源?

c# - 如何实现从一个 IObserver 到另一个 IObserver 的原子切换?

java - 将 API 回调绑定(bind)到 RxJava Observable

c# - Visual Studio 2013中的C#方法重载解决问题