2012-04-09 25 views
5

Por favor, cualquiera me haga saber cómo funciona el operador SelectMany en Rx. Tampoco sé más sobre este operador en Linq.Seleccione Muchos en Rx

Explique esto con la ayuda de un ejemplo simple, y también en qué ocasión utilizaremos este operador en Rx.

+1

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

+0

Parece un poco complicado ... soy bastante nuevo en la tecnología. ¿Puede proporcionar una muestra simple? – StezPet

Respuesta

16

SelectMany combina la proyección y el aplanamiento en un solo paso. Suponga que tiene un número de listas como { {1, 2}, {3, 4, 5}, { 6, 7 } } puede utilizar SelectMany para aplanarlo en una sola lista como: { 1, 2, 3, 4, 5, 6, 7}

SelectMany en Rx puede acoplar múltiples secuencias en una observables (en realidad hay varias sobrecargas).

Para un ejemplo práctico, suponga que tiene una función DownloadFile(filename) que le da un Observable que produce un valor cuando el archivo finaliza la descarga. Ahora puede escribir:

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!")); 

Los 3 observables de DownloadFile se aplanan en una sola, por lo que puede esperar a 3 valores para llegar a ver que todas las descargas se han completado.

+0

No pude entender por qué usó SelectMany aquí en su código, no tiene una lista de listas -> no obtuvo ningún aplanar, quiero decir, ¿cómo será el resultado diferente en su código si solo usaste seleccionar? –

+0

Con 'Seleccionar', terminarías con un observable de observables. – Asti

+0

¿Podría explicar más? eso no estaba claro para mí, todavía soy nuevo en LINQ y RX –

18

SelectMany es sólo:

source.Select(selector).Merge(); 

En otras palabras, se selecciona la entrada de la fuente en una corriente de observables, a continuación, se aplana cada observable en una corriente de los resultados.