2017-01-12 9 views
1

私はIObservableを持って「配布」:私はメソッドを持っていると思いこのようなシーケンスを生成する他の配列間の配列

A1, A2, A3, A4, B1, B2, B3, B4, C1, C2, C3, C4, D1, D2, D3, D4, ... 

を:

に呼び出され、
IObservable<T>[] Distribute(IObservable<T>, count) 

IObservableは、他のIObservable(この場合4つ)を生成し、それぞれの出力が元のシーケンス(疑似コード)の相対的な「位置」からの要素になるようにします:

GetOutput(unzipped[0]) = { A1, B1, C1, D1, ... }; 
GetOutput(unzipped[1]) = { A2, B2, C2, D2, ... }; 

これは、N人(N = count)のカードを扱う人物と同じです。人物ごとにカードを1枚ずつ与えてからやり直します。

質問は以下のとおりです。

  1. それは、既存の受信方法とその機能を取得することはできますか?
  2. もしそうでなければ、どうすれば実装できますか?私はRxの中で、あなたは一般的に限りIObservable地に滞在する場合、上記1の質問への答えは「はい」...

答えて

4

ある場合を除いて、インデックス内のモジュロ除算でWhereを使用することが許容されることができることを感じます可能。だから、より自然な署名は次のようになりますIObservable<IObservable<T>> Distribute(IObservabe<T> source, int count)、次のようになります。

public static IObservable<IObservable<T>> Distribute<T>(this IObservable<T> source, int count) 
{ 
    var toReturn = source.Select((t, i) => Tuple.Create(t, i)) 
     .GroupBy(t => t.Item2 % count) 
     .Select(g => g.Select(t => t.Item1)) 
    return toReturn; 
} 

このような配列としてあなたはそれを得ることができます。

+0

美しいが、私は最初のフォームを試してみましたがからサブスクリプション生成された 'IObservable'は結果を伝播していないようです。 https://gist.github.com/heltonbiker/2075c1ba089f695b9f9294c9bc551e66をご覧ください。あるいは、「Do」よりも優れた作成されたシーケンスをそれぞれ購読する良い方法があります。 – heltonbiker

+0

基本的には、ソースコレクションにすでに登録されている個別のIObservablesが必要なので、それぞれのサブスクリプションを自由に作成できます。 – heltonbiker

+1

要点のクイックフィックスは、 'Do'を' Subscribe'にすることです。 'Do'は一番下に' Subscribe'がなければ動作しません。 – Shlomo

関連する問題