一位朋友问我-我认为这是一个好问题,因此我在此转发了我的答案:

我有两个流:

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/

10-11 20:52