Sto cercando di convertire una raccolta IEnumerable in una IObservable senza utilizzare i metodi Rx ToObservable() e ToEnumerable().come convertire IEnumerable in IObservable?
risposta
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
Is 'Disposable.Create (() => {});' diverso da 'Disposable.Empty'? – interlude
@interlude Non proprio, ho appena usato il sovraccarico in modo da poter aggiungere la logica di pulizia, se necessario. – JerKimball
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.
Perché non si desidera utilizzare 'ToObservable()'? –
@DanielHilgarth Lo ammetto, sono anche curioso - questo è il punto di 'ToObservable()' – JerKimball