我将传入的连接暴露为:
IObservable<double>
每次建立新连接时,我都会通过以下方式通知:
IObservable<IObservable<double>> m_IncomingConnections;
我的问题是我想构建一个我可以用来做的操作符
IObservable<IList<double>> m_joined = m_IncomingConnections.JoinAll();
因此假设在开始时我有三个传入连接,m_joined observable将推送带有三个元素的列表。
|--a1----a2----------a3-------
|b1---b2----b3--b4---------b5-
|---c1----c2---c3--c4---------
结果:
>[a1,b1,c1]
>[a1,b2,c1]
>[a2,b2,c1]
>[a2,b2,c2]
>[a2,b3,c2]
你明白了,但是如果新的连接进来,我希望一旦新连接推送新值,阵列现在变成4号。
所有这一切都是我现在可以使用
m_joined.Select(vv => vv.Average());
每次推入新值时,流式传输所有流的平均值。
有关为Rx实施此类扩展的任何建议吗?
感谢您的帮助。
答案 0 :(得分:1)
主要问题是将一个可观察的列表转换为一个可观察的列表。
IObservable<List<T>> CombineNLatest<T>(List<IObservable<T>> list){
return list
.Aggregate
( Observable.Return(new List<T>())
, (a, n) => Observable.CombineLatest
( a
, b
, (l, e) => l.Concat(e).ToList()));
}
虽然我还没有测试过,但还是有类似的东西。现在你需要解决这个问题 建立你的清单&gt;
IObservable<List<IObservable<T>>
CollectList<T>
(this IObservable<IObservable<T>> input)
{
var initial = new List<IObservable<T>>();
return Observable.Create(observer => {
return input.Subscribe( o => {
initial.Append(o);
observer.OnNext(initial);
}
});
}
再次未经测试,但我希望一般的想法是明确的。现在将它们连在一起
IObservable<IObservable<T>> input = ...;
IObservable<IObservable<List<T>>> intermediate = input
.CollectList()
.Select( list => CombineNLatest(list) );
IObservable<List<T>> final = intermediate.Switch();