c# - 如何将缓慢移动的可观测值与快速移动的可观测值的最新值结合起来

标签 c# system.reactive

一个 friend 问我这个问题 - 我认为这是一个很好的问题,所以我在这里重新发布它和我的答案:

我有这两个流:

var slowSource = Observable.Interval(TimeSpan.FromSeconds(1));
var fastSource = Observable.Interval(TimeSpan.FromMilliseconds(100));

我想将它们组合起来,以便生成包含以下内容的输出对 -来自slowSource的下一个值 - fastSource 的最新值

我只想要来自 SlowSource 的每个值一个输出对。例如,前三个输出值可能如下所示:

0,8
1,18,
2,28

连接让我很接近,但最终每个 SlowSource 都会有多个输出(我猜是由于持续时间重叠的方式):

var qry = slowSource.Join(
          right: fastSource,
          leftDurationSelector: i => fastSource,
          rightDurationSelector: j => fastSource,
          resultSelector: (l, r) => {return new {L = l, R = r};})

.Subscribe(Console.WriteLine);

使用 GroupJoin 和 Select 会产生看起来正确的输出:

var qry2 = slowSource.GroupJoin(
              right: fastSource,
              leftDurationSelector: i => fastSource,
              rightDurationSelector: j => fastSource,
              resultSelector: (l, r) => {return new {L= l, R = r};}
              )
          .Select(async item => {
            return new {L = item.L, R = await item.R.FirstAsync()};})
          .Subscribe(Console.WriteLine);

但是,这感觉并不是一个很好的方法;必须有一种更好的方法,使用其他组合器以更简单的方式完成类似的事情。有吗?

最佳答案

IObservableIEnumerable 组合在一起的 Zip 重载怎么样?它使用 MostRecent() 来获取流的最新值的样本作为可枚举值。

slowSource.Zip(fastSource.MostRecent(0), (l,r) => new {l,r})

关于c# - 如何将缓慢移动的可观测值与快速移动的可观测值的最新值结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20980512/

相关文章:

c# - UI 自动化是否有任何依赖项?

c# - 为什么我不能以这种方式有条件地添加到列表中?

c# - Visual Studio 2013 连接到 SQL Server 2014

c# - 在特定时间后执行 Action ,但如果手动调用,则重置计时器

c# - Rx 如何从 pub/sub 模式创建序列

c# - Rx IObservable 仅在值发生一定幅度变化时才产生值

c# - 在 C# 和 SQL Server 2008 R2 中使用 MD5

c# - IdentityServer4 和 Code with PKCE testing with Postman

c# - 在 Rx 中存储检索 IObservable 订阅状态

system.reactive - 在 Reactive Extensions 中实现自定义的基于硬件计时器的调度程序