一位朋友问我-我认为这是一个好问题,因此我在此转发了我的答案:
我有两个流:
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);
但是,这并不是一个好方法。必须有一种更好的方法,可以使用其他组合器以更简单的方式完成类似的工作。在那儿?
最佳答案
结合了IObservable
和IEnumerable
的Zip重载情况如何。它使用MostRecent()来获取流的最新值作为可枚举的样本。
slowSource.Zip(fastSource.MostRecent(0), (l,r) => new {l,r})
关于c# - 如何将慢速移动的观测值与快速移动的观测值的最新值组合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20980512/