如何将可枚举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一部分的函数特别感兴趣。和上面的例子一样,无限可观测值应该是可能的,也应该是无限可枚举的。
发布于 2014-08-23 13:01:37
到目前为止,这就是我想出来的。然而,这是一个自制的解决方案,而不是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的一个IObservable
实现,专门用于IEnumerable
。
发布于 2014-08-23 15:40:44
这将正确地转换您的“类型”。但是,您不能更改元素在下面传递的时间/方式的语义,因此不管您如何处理,您实际上都会以缓冲和阻塞告终。
dest = source.ToEnumerable().Map(x => x.ToObservable());
https://stackoverflow.com/questions/25461904
复制相似问题