![](/img/trans.png)
[英]Switching on IObservable<IEnumerable<IEnumerable<T>>>
[英]Turn an IObservable<IEnumerable<T>> into an IEnumerable<IObservable<T>>
我怎么会变成可观察到的一个枚举的xys
到观测的枚举yxs
,其中每个观测到的yxs
重点中的每一步的特定元素xys
? 我想要的是类似于可枚举的可枚举的转置。
例:
IObservable<IEnumerable<int>> xys = Observable.Generate(0, _ => true, i => ++i, i => new[] {0 + i, 1 + i, 2 + i});
// xys = emits {0,1,2}, {1,2,3}, ...
IEnumerable<IObservable<int>> yxs = new[]
{
Observable.Generate(0, i=>true, i=> ++i, i=>i),
Observable.Generate(1, i=>true, i=> ++i, i=>i),
Observable.Generate(2, i=>true, i=> ++i, i=>i),
};
// yxs = {emits 0, 1, ...}, {emits 1, 2, ...}, {emits 2, 3, ...}
我特别感兴趣的是一个已经属于Rx的功能。 像上面的例子一样,无限可观测量应该是可能的以及无限的可枚举。
这会正确转换您的“类型”。 但是,您无法更改元素何时/如何在下面传递的语义,因此无论您如何处理这些元素,您最终都将最终进行缓冲和阻止。
dest = source.ToEnumerable().Map(x => x.ToObservable());
这是我到目前为止所提出的。 但是,它是一个自制的解决方案,而不是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术语中,我认为它实际上是IObservable
monad的sequence
实现,专门用于IEnumerable
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.