Пожалуйста, дайте мне знать, как работает оператор SelectMany в Rx. Я тоже не знаю больше об этом операторе в Linq.
Пожалуйста, объясните это на простом примере, а также в каком случае мы будем использовать этот оператор в Rx.
Пожалуйста, дайте мне знать, как работает оператор SelectMany в Rx. Я тоже не знаю больше об этом операторе в Linq.
Пожалуйста, объясните это на простом примере, а также в каком случае мы будем использовать этот оператор в Rx.
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!"));
Все 3 наблюдаемых DownloadFile объединяются в один, поэтому вы можете дождаться получения 3 значений, чтобы убедиться, что все загрузки завершены.
Select вы получите наблюдаемое из наблюдаемых.
- person Asti; 27.12.2016
SelectMany просто:
source.Select(selector).Merge();
Другими словами, он выбирает входные данные источника в поток Observable, а затем объединяет каждый Observable в поток результатов.
Я нашел это короткое видео полезным для понимания SelectMany для Rx (и как более продвинутое использование мраморных диаграмм): http://channel9.msdn.com/Blogs/J.Van.Gogh/Reactive-Extensions-API-in-depth-SelectMany