Szukam przekonwertować kolekcję IEnumerable na IObservable jeden bez używania metod Rx ToObservable() i ToEnumerable().jak przekonwertować IEnumerable do IObservable?
Odpowiedz
Prosta odpowiedź - użyj ToObservable
. Po to jest to.
"Odpowiadając na rzeczywiste pytanie" odpowiedź - można uniknąć stosując Subjects
poprzez 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();
}
}
wyjściowa:
0
1
2
3
4
5
6
7
8
9
Czy 'Disposable.Create (() => {});' różni się od 'Disposable.Empty'? – interlude
@interlude Nie bardzo, użyłem przeciążenia, więc można dodać logikę czyszczenia, jeśli jest to wymagane. – JerKimball
Jeśli ktoś ma IEnumerable
nieznanego typu, istnieją dwa sposoby, jeden może "przekonwertować go do IObservable":
Skopiuj wszystkie dane w obiekcie do nowej kolekcji, która implementuje
IObservable
. Jeśli tak się stanie, zostaną zgłoszone tylko zmiany wprowadzone do nowej kolekcji. Zmiany dokonane w oryginale nie będą.Utwórz nowy obiekt, który będzie okresowo robić migawki zawartości
IEnumerable
; po zrobieniu każdej migawki, zgłoś wszystkie zmiany, które musiałyby zostać wprowadzone w poprzedniej migawce, aby pasowała do nowej. Dzięki temu podejściu, zmiany wprowadzone do oryginalnego obiektu zostaną zauważone, ale trudno jest zapewnić terminowe powiadomienia o aktualizacjach, nie tracąc wiele czasu na wielokrotne odczytywanie kolekcji, gdy nic się nie zmieni.
Istnieje kilka razy, gdy trzeba mieć IObservable
związany z oryginalnym IEnumerable
obiektu, zamiast do nowego obiektu, który jest fabrycznie napełniony z kopią danych; w takich przypadkach może być konieczne zastosowanie drugiego podejścia. Często jednak nie będzie możliwe szybkie wprowadzenie szybkości odpytywania, aby zapewnić terminowe aktualizacje bez powodowania niedopuszczalnego ładowania systemu, chyba że oryginalna kolekcja obsługuje funkcje, które nie są dostępne w arbitralnym IEnumerable
. Ponadto, jeśli nie zostanie nałożony wymóg dotyczący typu modelu IEnumerable
, prawdopodobnie będzie konieczne wprowadzenie ograniczeń w kontekście wątków, w których może on zostać zaktualizowany.
Dlaczego nie chcesz używać 'ToObservable()'? –
@DanielHilgarth Przyznaję, jestem również ciekawy - to jest punkt 'ToObservable()' – JerKimball