只需查看Rx连接扩展方法。我不知道如何使用它来创建键连接(使用关系域而不是时间域)?
var right = Observable.Range(4, 20);
var left = Observable.Range(0, 30).Where(n => n%2 == 0);
var e = from n1 in right
join n2 in left on ? equals ?
select new {n1, n2};
e.Subscribe(j => Console.WriteLine(" n1: {0}, n2: {1}", j.n1, j.n2));期望产出:
n1: 4, n2: 4
n2: 6, n2: 6
n3: 8, n2: 8
...不确定加入是否可以这样使用.?
编辑
这是可行的,但这样做正确吗(并发性、性能)?
var e = from n1 in right
from n2 in left
where n1 == n2
select new { n1, n2 };发布于 2012-01-15 23:34:01
重要的是要记住,随着时间的推移,可观察到的是集合--或者用另一种方式来说,它们是一系列事件。对于可枚举项,可以在某一时刻将其视为集合。
在可枚举的基础上加入是有意义的--所有的值在你加入的那一刻都是可用的。
当使用Rx时,这是不同的--几乎就像你需要做某种时间旅行一样!
所以,当你试图在Rx世界中做一个“连接”时,你说的是“在一段时间内,请记住可观测A上的所有值,并将它们与在这段时间内发生在可观测B上的值相匹配。”
Rx中的Join运算符专门用于定义自定义时间段和观察在时间段内发生的事件。
经典的情况是,当一个人进入或离开一个房间时,当某个事件(比如灯被打开)发生时,你想知道谁在房间里。
在某些方面,您的第二个查询,即SelectMany查询,只是在两个可观察对象的生存期内发生的一个连接,Rx必须记住所有的值才能生成匹配。它实际上是正在构建的一对集合,并在添加值时执行联接。
只要输入序列不太大,SelectMany的性能就很好(这可能仍然意味着大的,但不是太大的,是可以的),并且它们最终会终止。使用像点击中的事件模式这样的热点可观察性将是做SelectMany的一个错误的选择。
因此,如果您有一个特定的时间段来反对--使用Join --但是如果您只想连接两个可观测值之间的每个值,请使用SelectMany。
https://stackoverflow.com/questions/8860564
复制相似问题