在Rx中选择Many

Ste*_*Pet 7 .net c# system.reactive

请任何人告诉我SelectManyRx中的操作员如何工作.我也不知道Linq中有关此运算符的更多信息.

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

Ast*_*sti 18

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

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

对于一个实际的例子,假设你有一个函数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!"));
Run Code Online (Sandbox Code Playgroud)

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


Ana*_*tts 18

SelectMany只是:

source.Select(selector).Merge();
Run Code Online (Sandbox Code Playgroud)

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


yam*_*men 10

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