簡體   English   中英

轉一個IObservable <IEnumerable<T> &gt;進入IEnumerable <IObservable<T> &gt;

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM