这是我尝试使用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是可观察的或列表,我不会感到困扰。
非常感谢任何帮助。
此致 艾伦
答案 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,但是返回每个项目的结果。