将最新值与先前值组合在一个可观察流中

时间:2014-07-16 13:15:05

标签: c# .net system.reactive reactive-programming

我试图弄清楚如何获取T的可观察序列,并在我的订阅者中同时获取T的最新值和先前值。这是我的秒杀代码:

static void Main(string[] args)
{
    var latest = new Subject<string>();
    var previous = latest.SkipLast(1);
    var latestWithPrevious = latest.CombineLatest(previous, (l, p) => new { Latest = l, Previous = p });

    latestWithPrevious.Subscribe(x => Console.WriteLine("Latest: {0} Previous: {1}", x.Latest, x.Previous));

    latest.OnNext("1");
    latest.OnNext("2");
    latest.OnNext("3");

    Console.ReadKey();
}

我想要以下输出:

Publishing 1
Publishing 2
Latest: 2 Previous: 1
Publishing 3
Latest: 3 Previous: 2

但是,我得到以下内容:

Publishing 1
Publishing 2
Latest: 2 Previous: 1
Publishing 3
Latest: 3 Previous: 1
Latest: 3 Previous: 2

所以&#34; 3&#34;到latest会在latestWithPrevious中触发两个刻度:第一个具有Previous的旧值,第二个具有Previous的正确值。

我如何在这里实现目标?

1 个答案:

答案 0 :(得分:8)

使用Skip(1),而不是SkipLast(1)SkipLast会跳过流中的最后N个条目。

此外,CombineLatest在更改时仍然会触发每一方,因此您将获得比您想要的更多事件。使用Zip代替CombineLatestZip仅在每一方产生下一个值后触发。

最后,颠倒语义。 latest是跳过第一个值的系列,previous是包含第一个值的系列。

var source = new Subject<string>();
var previous = source;
var latest = source.Skip(1);
var latestWithPrevious = latest.Zip(previous, (l, p) => new { Latest = l, Previous = p});