组合IObservable <iobservable <t>&gt;进入IList <t> </t> </iobservable <t>

时间:2013-04-18 22:57:21

标签: .net c#-4.0 system.reactive

我将传入的连接暴露为:

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实施此类扩展的任何建议吗?

感谢您的帮助。

1 个答案:

答案 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();