Выберите «Многие» в Rx

Пожалуйста, дайте мне знать, как работает оператор SelectMany в Rx. Я тоже не знаю больше об этом операторе в Linq.

Пожалуйста, объясните это на простом примере, а также в каком случае мы будем использовать этот оператор в Rx.


person StezPet    schedule 09.04.2012    source источник


Ответы (3)


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 значений, чтобы убедиться, что все загрузки завершены.

person Asti    schedule 09.04.2012
comment
Я не мог понять, почему вы использовали SelectMany здесь в своем коде, у вас нет списка списков -> вы не получили никакого сглаживания, я имею в виду, как будет отличаться результат в вашем коде, если вы просто использовали select? - person Mohammed Noureldin; 27.12.2016
comment
С Select вы получите наблюдаемое из наблюдаемых. - person Asti; 27.12.2016
comment
Не могли бы вы объяснить больше? это было непонятно для меня, я все еще новичок в LINQ и RX - person Mohammed Noureldin; 27.12.2016

SelectMany просто:

source.Select(selector).Merge();

Другими словами, он выбирает входные данные источника в поток Observable, а затем объединяет каждый Observable в поток результатов.

person Ana Betts    schedule 11.04.2012

Я нашел это короткое видео полезным для понимания SelectMany для Rx (и как более продвинутое использование мраморных диаграмм): http://channel9.msdn.com/Blogs/J.Van.Gogh/Reactive-Extensions-API-in-depth-SelectMany

person yamen    schedule 11.04.2012