2013-06-06 22 views
6

Rx ToObservable()とToEnumerable()メソッドを使用せずに、IEnumerableコレクションをIOBservableのコレクションに変換しようとしています。 IEnumerableをIObservableに変換する方法は?

+7

なぜあなたは 'ToObservable()'を使いたくないのですか? –

+0

@DanielHilgarth私は、私も興味があります - それはTo Observable()のポイントです – JerKimball

答えて

7

簡易回答 - 使用ToObservable。それがそれのためのものです。答えは "実際の質問に答える"

- あなたはObservable.Create経由Subjectsの使用を避けることができます。

void Main() 
{ 
    var src = Enumerable.Range(0, 10); 
    var observable = Observable.Create<int>(obs => 
    { 
     foreach(var item in src) 
     { 
      obs.OnNext(item); 
     } 
     return Disposable.Create(()=>{}); 
    }); 

    using(observable.Subscribe(Console.WriteLine)) 
    { 
     Console.ReadLine(); 
    } 
} 

は出力:

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
+0

'Disposable.Create(()=> {});は' Disposable.Empty'と異なりますか? – interlude

+1

@interludeそうではなく、単に過負荷を使用したので、必要に応じてクリーンアップロジックを追加できます。 – JerKimball

1

1は、未知のタイプのIEnumerableを持っている場合は、二つの方法1があります「IObservableに変換できます」:

  • オブジェクト内のすべてのデータを、IObservableを実装する新しいコレクションにコピーします。これが完了すると、新しいコレクションに加えられた変更だけが報告されます。オリジナルの変更は反映されません。

  • IEnumerableの内容のスナップショットを定期的に取得する新しいオブジェクトを作成します。各スナップショットを作成した後、以前のスナップショットに加えられたすべての変更を報告して、新しいスナップショットと一致させる必要があります。このアプローチを使用すると、最終的に元のオブジェクトに加えられた変更が観察されますが、何も変更されていないときにコレクションを繰り返し読み込む時間を無駄にすることなく、タイムリーな更新通知を提供することは困難です。

1はIObservableがオリジナルIEnumerableオブジェクトにではなく、データのコピーを予め充填されている新しいオブジェクトにバインド持っている必要があるときに、いくつかの時間があります。そのような場合には、第2のアプローチが必要であるかもしれない。ただし、元のコレクションが任意のIEnumerableで利用できない機能をサポートしていない限り、受け入れられないシステムローディングを引き起こすことなく適時の更新を提供するのに十分なほどポーリングレートを速くすることはできません。さらに、IEnumerableのタイプに要件を課さない場合、スレッドコンテキストが更新される可能性のあるスレッドコンテキストに制限を加える必要があります。

関連する問題