如何合并不同数据的Rx流

时间:2014-02-26 01:30:55

标签: c#-4.0 system.reactive

这是我尝试使用Rx实现的简化方案。

public class A
{
    public int Id { get; set; }
    public string Name { get; set; }
};

public class B
{
    public int Id { get; set; }
    public int AId { get; set; }
    public string SomeProperty { get; set; }
};

public class C
{
    public A MyA { get; set; }
    public IObservable<B> MyBObservable { get; set; }
}

这是一个数据序列

A(1,“弗雷德”)

A(2,“汤姆”)

A(3,“哈利”)

B(100,1,“测试”)

B(101,3,“xxx”)

B(102,1,“test2”)

A(4,“简”)

...

注意:在相应的A实例之前不能有B实例。

我想得到一个看起来像

的结果

C(A(1,“Fred”),IObservable(B(100,1,“test”),B(102,1,“test2”))

C(A(2,“Tom”),IObservable为空)

C(A(3,“Harry”),IObservable(B(101,3,“xxx”))

C(A(4,“Jane”),IObservable为空)

结果必须包括A的所有实例(即使A还没有B)

我有一些用户代码

IObservable<A> obsA = Observable.Create<A> { ... };
IObservable<B> obsB = Observable.Create<B> { ... };

obsB.Publish(); // shared

    // what goes here ?

obsB.Connect();

我目前的尝试使用的是SelectMany,但并不能完全按照我想要的方式进行,因为我只能获得A出现B的条目。我还需要那些A没有B的条目。

是否可以执行类似

的操作
obsA.SelectMany(a => new C { MyA = a, MyBObservable = obsB.Where(x => x.AId == a.Id) });

如果它有帮助,那么obsA是一种可观察到的并且会完成。 obsB可以是热的或冷的可观察的。如果C是可观察的或列表,我不会感到困扰。

非常感谢任何帮助。

此致 艾伦

2 个答案:

答案 0 :(得分:1)

IObservable<A> obsA = Observable.Create<A> { ... };
IObservable<B> obsB = Observable.Create<B> { ... };

var c = from a in obsA
        join b in obsB on a.Id equals b.Id
        select new C(a, b);

答案 1 :(得分:0)

经过一些实验,我得到了以下内容

obsA.Subscribe(a => new C (a, obsB.Where(x => x.AId == a.Id)));

然后在C

的构造函数中
public C (MyA a, IObservable<B> obsB)
{
    MyA = a;
    obsB.Subscribe(o => .. do something ...);
}

在我的版本中,C类不包含observable,但是返回每个项目的结果。