Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 结合IObservable<;IObservable<;T>&燃气轮机;进入IList<;T>;_.net_C# 4.0_System.reactive - Fatal编程技术网

.net 结合IObservable<;IObservable<;T>&燃气轮机;进入IList<;T>;

.net 结合IObservable<;IObservable<;T>&燃气轮机;进入IList<;T>;,.net,c#-4.0,system.reactive,.net,C# 4.0,System.reactive,我将传入连接公开为: IObservable<double> 结果: >[a1,b1,c1] >[a1,b2,c1] >[a2,b2,c1] >[a2,b2,c2] >[a2,b3,c2] 你知道这个想法,但是如果一个新的连接进来,我希望一旦新的连接推送新的值,现在数组的大小就变成4 所有这些都是我现在可以使用的 m_joined.Select(vv => vv.Average()); 每次推入新值时,流式处理所有流的平均值 对Rx实施此类扩

我将传入连接公开为:

IObservable<double>
结果:

>[a1,b1,c1]
>[a1,b2,c1]
>[a2,b2,c1]
>[a2,b2,c2]
>[a2,b3,c2]
你知道这个想法,但是如果一个新的连接进来,我希望一旦新的连接推送新的值,现在数组的大小就变成4

所有这些都是我现在可以使用的

m_joined.Select(vv => vv.Average());
每次推入新值时,流式处理所有流的平均值

对Rx实施此类扩展有何建议


感谢您的帮助。

主要问题是将可观察列表转换为可观察列表

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()));
}
IObservable组合测试(列表){
返回列表
总数的
(Observable.Return(新列表())
,(a,n)=>可观察的组合测试
(一)
B
,(l,e)=>l.Concat(e.ToList());
}
像这样的东西,虽然我还没有测试过。现在你有问题了,你需要 建立您的列表>

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{
返回输入。订阅(o=>{
首字母。附加(o);
OnNext观察员(首字母);
}
});
}
再次没有测试,但我希望总体思路是明确的。现在把它们锁在一起

IObservable<IObservable<T>> input = ...;
IObservable<IObservable<List<T>>> intermediate = input
   .CollectList()
   .Select( list => CombineNLatest(list) );

IObservable<List<T>> final = intermediate.Switch();
IObservable输入=。。。;
IObservable intermediate=输入
.LIST()
.选择(列表=>CombineLenTest(列表));
IObservable final=中间.Switch();
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()));
}
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();