Важно помнить, что наблюдаемые являются коллекциями с течением времени или, иначе говоря, представляют собой серию событий.Ибо перечислимые элементы можно рассматривать как коллекции в определенный момент времени.
Имеет смысл объединять перечислимые элементы - все значения доступны вам в тот момент, когда вы выполняете объединение.
При использовании Rx все по-другому - почти как будто вам нужно совершить какое-то путешествие во времени!
Итак, всякий раз, когда вы пытаетесь присоединиться к миру Rx, вы говорите что-то вроде «для некоторых».пожалуйста, запомните все значения на наблюдаемой А и сопоставьте их со значениями, которые происходят на наблюдаемой В в течение этого периода. "
Оператор Join
в Rx специально используется для определения пользовательских периодов времени инаблюдать за событиями, которые происходят в течение периодов времени.
Классическая ситуация такова, что у вас есть поток событий для каждого входа или выхода из комнаты, и вы хотите знать, кто был в комнате, когда какое-то событие (скажем, свет был включен)
В некоторых отношениях ваш второй запрос, SelectMany
, является просто соединением, котороеccurs за время существования двух наблюдаемых, и Rx должен был запомнить все значения для генерации совпадений.По сути, это пара создаваемых коллекций и выполняющих объединения при добавлении значений.
Производительность SelectMany
хорошая, пока входные последовательности не становятся слишком большими (что все еще может означать, что большой,но не слишком большой, все в порядке) и что они в конечном итоге прекращаются.Использование горячих наблюдаемых, таких как шаблоны событий от кликов, было бы плохим выбором для SelectMany
против.
Итак, если у вас есть определенный период времени для объединения - используйте Join
- но если вы просто хотитечтобы объединить каждое значение между двумя наблюдаемыми, используйте SelectMany
.