在Rx中选择Many

请任何人告诉我Rx中的SelectMany运算符是如何工作的。 我也不知道Linq中有关此运算符的更多信息。

请在一个简单示例的帮助下解释这一点,以及在什么情况下我们将在Rx中使用此运算符。

SelectMany将投影和展平结合为一个步骤。 假设您有许多列表,例如{ {1, 2}, {3, 4, 5}, { 6, 7 } }您可以使用SelectMany将其展平为单个列表,如: { 1, 2, 3, 4, 5, 6, 7}

Rx中的SelectMany可以将多个序列展平为一个observable(实际上有几个重载)。

对于一个实际的例子,假设你有一个函数DownloadFile(filename) ,它给你一个Observable,它在文件完成下载时产生一个值。 你现在可以写:

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

所有3个DownloadFile可观察对象都被展平为一个,因此您可以等待3个值到达以查看所有下载是否已完成。

SelectMany只是:

 source.Select(selector).Merge(); 

换句话说,它选择源输入到Observables流中,然后将每个Observable展平为结果流。

我发现这个简短的video有助于理解SelectMany for Rx(以及作为大理图的更高级用法): http : //channel9.msdn.com/Blogs/J.Van.Gogh/Reactive-Extensions-API-in-depth -SelectMany