.net - 使用 Rx 求和

标签 .net system.reactive

一定有人已经解决了这个问题。
想象一下,我有一个类会定期引发有关值更改的事件(例如 PropertyChanged)
那个值(value)只不过是金钱的数量。

现在,我想利用 Rx 来获得最后 10 分钟增加的总和。例如BufferWithTime 没有帮助,因为我总是需要最后 10 分钟。

任何想法我怎么能做到这一点?

蒂亚
马丁

最佳答案

下面的解决方案涉及使用 Observable.Scan 在列表中保留前十分钟相关事件数据的状态。 .状态被维护为一个带有 int 的元组列表。 (钱)和一个 DateTime作为值(value)观。

var events = Observable.FromEvent<YourEventArgs>(
    h => SomeEvent += h, h => SomeEvent -= h);
var runningSums =
    events.Scan(new List<Tuple<int, DateTime>>(),
                (l, e) =>
                {
                    var now = DateTime.Now;
                    // Add last event data to list.
                    l.Add(Tuple.Create(e.EventArgs.Money, now));
                    // Return the correct part of the list (everything
                    // from the last ten minutes).
                    return l.Where(t => (now - t.Item2) <
                                   TimeSpan.FromMinutes(10)).ToList();
                 })
          .Select(l => l.Sum(t => t.Item1));
runningSums.Subscribe(sum => Console.WriteLine(sum));

编辑 :不会为每个事件返回新列表的示例:
var events = Observable.FromEvent<YourEventArgs>(
    h => SomeEvent += h, h => SomeEvent -= h);
var runningSums =
    events.Scan(Tuple.Create(new List<Tuple<int, DateTime>>(),
                             DateTime.Now - TimeSpan.FromMinutes(10)),
                (l, e) =>
                {
                    var now = DateTime.Now;
                    l.Item1.Add(Tuple.Create(e.EventArgs.Nr, now));
                    // if (trimming-condition) then trim front of list...
                    return Tuple.Create(l.Item1, now - TimeSpan.FromMinutes(10));
                })
          .Select(l => l.Item1.Where(t => t.Item2 > l.Item2).Sum(t => t.Item1));
runningSums.Subscribe(sum => Console.WriteLine(sum));

关于.net - 使用 Rx 求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3725976/

相关文章:

system.reactive - Rx 中的历史调度程序

.net - 从Reactive Extensions(Rx)中的不同线程触发OnNext是不礼貌的吗?

c# - 为什么 Task.WhenAny 没有抛出预期的 TimeoutException?

c# - 最有用的属性

c# - Entity Framework 错误地自动命名列

c# - .NET 中 String.GetHashCode() 的哈希质量和稳定性?

c# - Observable.FromAsync 与 Task.ToObservable

c# - 如何将 vector<int> 从 C++ dll 编码到 C# 应用程序?

c# - 在 Fluent NHibernate 中通过 ID 设置引用的实体

c# - Observable.Interval 未以预期频率更新 UI