2012-04-09 16 views
5

Proszę, daj mi znać, jak działa operator SelectMany w Rx. Nie wiem też więcej o tym operatorze w Linq.Wybierz wiele w Rx

Proszę wyjaśnić to za pomocą prostego przykładu, a także w jakim przypadku użyjemy tego operatora w Rx.

+1

http://stackoverflow.com/questions/3869329/rx-enumerableex-for-vs -enumerable-selectmany –

+0

Wydaje się nieco skomplikowane .. Jestem całkiem nowy w tej technologii. możesz podać prosty przykład – StezPet

Odpowiedz

16

łączy projekcję i spłaszczenie w jednym kroku. Załóżmy, że masz kilka wykazów takich jak { {1, 2}, {3, 4, 5}, { 6, 7 } } można użyć SelectMany aby je spłaszczyć do jednego wykazu takich jak: { 1, 2, 3, 4, 5, 6, 7}

SelectMany w Rx może spłaszczyć do jednego z wielu sekwencji obserwowalny (nie są w rzeczywistości kilka przeciążenia).

Dla praktycznego przykładu załóżmy, że masz funkcję DownloadFile(filename), która daje obserwowalność, która generuje wartość, gdy plik zostanie pobrany. Teraz można napisać:

string[] files = { "http://.../1", "http://.../2", "http://.../3" }; 

files.ToObservable() 
       .SelectMany(file => DownloadFile(file)) 
       .Take(3) 
       .Subscribe(c => Console.WriteLine("Got " + c) ,()=> Console.WriteLine("Completed!")); 

Wszystkie 3 obserwable z DownloadFile są spłaszczone w jeden, więc można czekać na 3 wartości przyjeżdżać, aby zobaczyć, że wszystkie pliki do pobrania są zakończone.

+0

Nie mogłem zrozumieć, dlaczego użyłeś tutaj SelectMany w twoim kodzie, nie masz listy list -> nie dostałeś żadnego spłaszczenia, to znaczy, jak wynik będzie inny w twoim kod, jeśli właśnie użyłeś wybierz? –

+0

Z 'Select', skończyłbyś z obserwowalną obserwowalnością. – Asti

+0

Czy mógłbyś wyjaśnić więcej? to nie było dla mnie jasne, wciąż jestem nowy w LINQ i RX –

18

SelectMany tylko:

source.Select(selector).Merge(); 

Innymi słowy, wybór źródła sygnału wejściowego do strumienia obserwabli, to spłaszcza każdy Obserwowalne do strumienia wyników.