2013-06-06 13 views
6

Sto cercando di convertire una raccolta IEnumerable in una IObservable senza utilizzare i metodi Rx ToObservable() e ToEnumerable().come convertire IEnumerable in IObservable?

+7

Perché non si desidera utilizzare 'ToObservable()'? –

+0

@DanielHilgarth Lo ammetto, sono anche curioso - questo è il punto di 'ToObservable()' – JerKimball

risposta

7

Risposta semplice: utilizzare ToObservable. Ecco a cosa serve

"Rispondendo alla domanda vera e propria" risposta - è possibile evitare di utilizzare Subjects via Observable.Create:

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(); 
    } 
} 

uscita:

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

Is 'Disposable.Create (() => {});' diverso da 'Disposable.Empty'? – interlude

+1

@interlude Non proprio, ho appena usato il sovraccarico in modo da poter aggiungere la logica di pulizia, se necessario. – JerKimball

1

Se uno ha un IEnumerable di tipo sconosciuto, ci sono due modi uno può "convertirlo in IObservable":

  • Copia tutti i dati nell'oggetto in una nuova raccolta che implementa IObservable. In tal caso, verranno riportate solo le modifiche apportate alla nuova raccolta. Le modifiche apportate all'originale non lo faranno.

  • Creare un nuovo oggetto che effettui periodicamente istantanee del contenuto di IEnumerable; dopo aver scattato ogni istantanea, segnalare tutte le modifiche che si dovevano apportare all'istantanea precedente per farlo corrispondere a quella nuova. Utilizzando questo approccio, le modifiche apportate all'oggetto originale verranno osservate, eventualmente, ma è difficile fornire notifiche di aggiornamento tempestive senza perdere molto tempo a leggere ripetutamente la raccolta quando nulla è cambiato.

Ci sono alcuni momenti in cui si ha la necessità di avere la IObservable legata alle IEnumerable oggetto originale, piuttosto che a un nuovo oggetto che è pre-riempita con una copia dei dati; in questi casi, potrebbe essere necessario il secondo approccio. Spesso, tuttavia, non è possibile rendere il polling abbastanza veloce da fornire aggiornamenti tempestivi senza causare un caricamento del sistema inaccettabile a meno che la raccolta originale supporti funzionalità che non sono disponibili in un arbitrario IEnumerable. Inoltre, se non si impongono requisiti sul tipo di IEnumerable, è probabile che si debbano porre delle restrizioni ai contesti di threading in cui potrebbe essere aggiornato.