首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将IObservable<IEnumerable<T>>转换为IEnumerable<IObservable<T>>

将IObservable<IEnumerable<T>>转换为IEnumerable<IObservable<T>>
EN

Stack Overflow用户
提问于 2014-08-23 12:25:57
回答 2查看 1K关注 0票数 3

如何将可枚举xys的可观测性转换为可观测yxs的枚举,其中yxs的每个可观测到的集中在xys的每个时间步骤的特定元素上?我想要的类似于可枚举的可枚举项的换位。

示例:

代码语言:javascript
运行
复制
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一部分的函数特别感兴趣。和上面的例子一样,无限可观测值应该是可能的,也应该是无限可枚举的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-23 13:01:37

到目前为止,这就是我想出来的。然而,这是一个自制的解决方案,而不是Rx的一部分。如果有人告诉我一个涉及库函数的解决方案,我会更感激。

代码语言:javascript
运行
复制
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

票数 -1
EN

Stack Overflow用户

发布于 2014-08-23 15:40:44

这将正确地转换您的“类型”。但是,您不能更改元素在下面传递的时间/方式的语义,因此不管您如何处理,您实际上都会以缓冲和阻塞告终。

代码语言:javascript
运行
复制
dest = source.ToEnumerable().Map(x => x.ToObservable());
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25461904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档