转动IObservable <ienumerable <t>&gt;进入IEnumerable <iobservable <t>&gt; </iobservable <t> </ienumerable <t>

时间:2014-08-23 12:25:58

标签: c# linq system.reactive

如何将可枚举的xys的可观察量转换为可观察的yxs枚举,其中yxs的每个可观察量都集中在{{1}的每个时间步长的特定元素上}}?我想要的是类似于可枚举的可枚举的转置。

示例:

xys

我特别感兴趣的是已经是Rx一部分的功能。与上面的例子一样,无限可观测量应该是可能的以及无限的可枚举。

2 个答案:

答案 0 :(得分:2)

这会正确转换您的“类型”。但是,您无法更改元素何时/如何在下面传递的语义,因此无论您如何处理此元素,您最终都将最终进行缓冲和阻止。

dest = source.ToEnumerable().Map(x => x.ToObservable());

答案 1 :(得分:-1)

这是我到目前为止所提出的。但是,它是一个自制的解决方案,而不是Rx的一部分。如果有人向我指出涉及图书馆功能的解决方案,我将不胜感激。

public static IEnumerable<IObservable<T>> ObserveElements<T>(this IObservable<IEnumerable<T>> obs)
{
    var i = 0;
    while (true)
    {
        var idx = i++;
        yield return from enumerable in obs
                     let x = enumerable.ElementAtOrDefault(idx)
                     where !Equals(x, default(T))
                     select x;
    }
}

显然,你.Take()只会根据需要提供尽可能多的观察结果。

在Haskell术语中,我认为它实际上是sequence monad的IObservable实现,专门用于IEnumerable