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