2013-06-06 19 views
6

Ich bin auf der Suche nach einer IEnumerable Sammlung zu einem IObservable ohne Rx ToObservable() und ToEnumerable() -Methoden zu konvertieren.Wie konvertiert man IEnumerable in IObservable?

+7

Warum möchten Sie nicht 'ToObservable()' verwenden? –

+0

@DanielHilgarth Ich gebe zu, ich bin auch neugierig - das ist der Punkt von 'ToObservable()' – JerKimball

Antwort

7

Einfache Antwort - verwenden Sie ToObservable. Dafür ist es da.

"Die Beantwortung der eigentlichen Frage" Antwort - können Sie mit Subjects über Observable.Create vermeiden:

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

Ausgang:

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

Ist 'Disposable.Create (() => {});' anders als 'Disposable.Empty'? – interlude

+1

@interlude Nicht wirklich, ich habe nur die Überladung verwendet, so könnte man bei Bedarf eine Aufräumlogik hinzufügen. – JerKimball

1

Wenn man eine IEnumerable unbekannter Art hat, gibt es zwei Möglichkeiten, eine kann es in IObservable "umwandeln":

  • Kopieren Sie alle Daten im Objekt in eine neue Sammlung, die IObservable implementiert. Wenn dies geschieht, werden nur Änderungen an der neuen Sammlung gemeldet. Änderungen am Original werden nicht vorgenommen.

  • Erstellen Sie ein neues Objekt, das regelmäßig Momentaufnahmen des Inhalts der IEnumerable; Notieren Sie nach jedem Snapshot alle Änderungen, die an dem vorherigen Snapshot vorgenommen werden müssen, damit er mit dem neuen Snapshot übereinstimmt. Bei dieser Vorgehensweise werden am ursprünglichen Objekt vorgenommene Änderungen eventuell beobachtet, es ist jedoch schwierig, zeitnahe Aktualisierungsbenachrichtigungen bereitzustellen, ohne viel Zeit mit dem wiederholten Lesen der Sammlung zu verschwenden, wenn sich nichts geändert hat.

Es gibt einige Male, wenn man die IObservable zum ursprünglichen IEnumerable Objekt gebunden haben muss, anstatt auf ein neues Objekt, das mit einer Kopie der Daten vorgefüllt ist; In solchen Fällen kann der zweite Ansatz erforderlich sein. Häufig wird es jedoch nicht möglich sein, die Abfragerate schnell genug zu machen, um zeitnahe Aktualisierungen zu liefern, ohne dass dies zu einem inakzeptablen Systemladevorgang führt, es sei denn, die ursprüngliche Sammlung unterstützt Funktionen, die nicht in einem beliebigen Format verfügbar sind. Wenn man keine Anforderungen an den Typ IEnumerable stellt, muss man wahrscheinlich Einschränkungen in den Threading-Kontexten machen, in denen er aktualisiert werden könnte.

Verwandte Themen