我试图弄清楚如何获取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
的正确值。
我如何在这里实现目标?
答案 0 :(得分:8)
使用Skip(1)
,而不是SkipLast(1)
。 SkipLast
会跳过流中的最后N个条目。
此外,CombineLatest
在更改时仍然会触发每一方,因此您将获得比您想要的更多事件。使用Zip
代替CombineLatest
。 Zip
仅在每一方产生下一个值后触发。
最后,颠倒语义。 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});