Rx объединяет ключи, а не длительности - PullRequest
0 голосов
/ 14 января 2012

Просто изучаю метод расширения Rx join. Я не могу понять, как бы я использовал это для создания ключевого соединения (используя реляционный домен вместо временного домена)?

var right = Observable.Range(4, 20);
var left = Observable.Range(0, 30).Where(n => n%2 == 0);
var e = from n1 in right
        join n2 in left on ? equals ?
        select new {n1, n2};
e.Subscribe(j => Console.WriteLine("  n1: {0}, n2: {1}", j.n1, j.n2));

Желаемый вывод:

n1: 4, n2: 4
n2: 6, n2: 6
n3: 8, n2: 8
...

Не уверен, можно ли таким способом использовать Join ...?

EDIT

Это работает, но правильно ли это делать (параллелизм, производительность)?

var e = from n1 in right
        from n2 in left
        where n1 == n2
        select new { n1, n2 };

Ответы [ 2 ]

3 голосов
/ 16 января 2012

Важно помнить, что наблюдаемые являются коллекциями с течением времени или, иначе говоря, представляют собой серию событий.Ибо перечислимые элементы можно рассматривать как коллекции в определенный момент времени.

Имеет смысл объединять перечислимые элементы - все значения доступны вам в тот момент, когда вы выполняете объединение.

При использовании Rx все по-другому - почти как будто вам нужно совершить какое-то путешествие во времени!

Итак, всякий раз, когда вы пытаетесь присоединиться к миру Rx, вы говорите что-то вроде «для некоторых».пожалуйста, запомните все значения на наблюдаемой А и сопоставьте их со значениями, которые происходят на наблюдаемой В в течение этого периода. "

Оператор Join в Rx специально используется для определения пользовательских периодов времени инаблюдать за событиями, которые происходят в течение периодов времени.

Классическая ситуация такова, что у вас есть поток событий для каждого входа или выхода из комнаты, и вы хотите знать, кто был в комнате, когда какое-то событие (скажем, свет был включен)

В некоторых отношениях ваш второй запрос, SelectMany, является просто соединением, котороеccurs за время существования двух наблюдаемых, и Rx должен был запомнить все значения для генерации совпадений.По сути, это пара создаваемых коллекций и выполняющих объединения при добавлении значений.

Производительность SelectMany хорошая, пока входные последовательности не становятся слишком большими (что все еще может означать, что большой,но не слишком большой, все в порядке) и что они в конечном итоге прекращаются.Использование горячих наблюдаемых, таких как шаблоны событий от кликов, было бы плохим выбором для SelectMany против.

Итак, если у вас есть определенный период времени для объединения - используйте Join - но если вы просто хотитечтобы объединить каждое значение между двумя наблюдаемыми, используйте SelectMany.

0 голосов
/ 16 января 2012

Если это не во временной области, почему бы вам просто не использовать Enumerable?

...