IObservable <int>を使用してIObservable <T>をさまざまな長さのIObservable <T []>にセグメント化する方法

Arbuthnot Smingleigh

可変長配列に順番に組み合わせる必要のある要素をIObservable<T>返す「値」があり、次の配列の長さを指示Tする「コントロール」IObservable<int>があります。要素を削除したり、繰り返したり、結果を乱したりすると、結果が無意味になります。

これは、私がRx.NETで書き直しているシリアル接続されたロボットプロジェクト用です。

IObservable<char> values = new [] {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' }.ToObservable();
IObservable<int> control = new [] { 1, 4, 2 }.ToObservable();
IObservable<char[]> result = control.SelectMany(length => values.Take(length).ToArray());

私はこのようなものを見たいです:

values  ----A--B--C--D--E--F--G--H-->
control --1-----4---------------2--->
result  ---[A]---------[BCDE]--[FG]->

しかし、これまでの私の試みは結果として

-[A]-[AB]-[ABCD]->
Progman

いくつかのヘルパーサブジェクトを作成して、新しいオブザーバブルを準備/作成し、必要な新しいオブザーバブルを構築できます。これらの種類のオブザーバブルのサブジェクトを作成できます。

  1. から読み取られた数に等しいカウントの一意の値を繰り返す新しいオブザーバブルを作成しますcontrol(1, 4, 2)あなたから取得し(guid_1, guid_2, guid_2, guid_2, guid_2, guid_3, guid_3)ます。これをオブザーバブルと呼びrepeatSizeます。
  2. Zip()演算子を使用して、repeatSizeからそれぞれ1つの値を結合しますvalues次の値でオブザーバブルを取得します((A,guid_1), (B,guid_2), (C,guid_2), (D,guid_2), (E,guid_2), (F,guid_3), (G,guid_3))これをオブザーバブルと呼びzippedValuesます。
  3. 購読してzippedValues、元の値をリストに追加/追加します。また、repeatSizeオブザーバブルから前の値を保存しますの現在の値と比較してくださいrepeatSize変更された場合(からguid_2へのようguid_3)、終了/開始に到達したことがわかるので、入力されたリストを新しいオブザーバブルに送信できます。その後、リストを再度リセットして、再度入力を開始します。

2〜3個のSubject<T>オブジェクトを作成し、それらをサブスクライブし、いくつかのOnNext()呼び出しを使用して、他のオブザーバブルのサブスクリプションからそれらを埋める必要がある場合があります

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ