我正在尝试将两个可观察值的值共享某个键的值组合在一起。

每当第一个可观察值产生新值时,我都想产生一个新值,再结合第二个可观察值的最新值,该选择取决于第一个可观察值的最新值。

伪代码示例:

var obs1 = Observable.Interval(TimeSpan.FromSeconds(1)).Select(x => Tuple.create(SomeKeyThatVaries, x)

var obs2 = Observable.Interval(TimeSpan.FromMilliSeconds(1)).Select(x => Tuple.create(SomeKeyThatVaries, x)

from x in obs1
  let latestFromObs2WhereKeyMatches = …
  select Tuple.create(x, latestFromObs2WhereKeyMatches)


有什么建议么?

显然,这可以通过订阅第二个可观察对象并创建具有可通过键索引的最新值的字典来实现。但我正在寻找一种不同的方法。

使用场景:从一股股票报价中计算出的一分钟价格柱。在这种情况下,关键是股票行情,字典中包含具体股票行情的最新要价和买价,然后将其用于计算中。

(顺便说一句,谢谢戴夫和詹姆斯,这是一次非常富有成果的讨论)

(对格式感到抱歉,很难在iPad上使用。)

最佳答案

...为什么要寻找其他方法?听起来您对我来说是正确的。这是简短的简单代码...大致来说,它类似于:

var cache = new ConcurrentDictionary<long, long>();
obs2.Subscribe(x => cache[x.Item1] = x.Item2);
var results = obs1.Select(x => new {
    obs1 = x.Item2,
    cache.ContainsKey(x.Item1) ? cache[x.Item1] : 0
});


归根结底,C#是一种OO语言,并且线程安全的可变集合的繁重工作已经为您完成。

可能有一些花哨的Rx方法(可能会涉及到联接之类的感觉)...但是它将保持多久?它将如何执行?

$ 0.02

关于c# - 将一个可观察值与另一个可观察值相结合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27507484/

10-11 05:18