2013-12-05 3 views
0

Реактивные Расширения имеет метод расширения:C# реактивное расширение - Join() перегружает

Join(this IObservable<TLeft> left, IObservable<TRight> right, 
    Func<TLeft, IObservable<TLeftDuration>> leftDurationSelector, 
    Func<TRight, IObservable<TRightDuration>> rightDurationSelector, 
    Func<TLeft, TRight, TResult> resultSelector) 

Однако, нет никакой перегрузки, которая также принимает Func<TLeft, TRight, bool> как условие соединения. В результате этот метод возвращает полное декартово произведение левой и правой.

Я осуществил это как

public static IObservable<TResult> Join<TLeft, TRight, TResult>(
     this IObservable<TLeft> left, IObservable<TRight> right, Func<TLeft, TRight, bool> joinCondition, 
     Func<TLeft, TRight, TResult> resultSelector) 
    { 
     return left.Join(right, l => Observable.Never<TLeft>(), r => Observable.Never<TRight>(), 
      (l, r) => new Tuple<TLeft, TRight>(l, r)) 
      .Where(CurryTuple(joinCondition)) 
      .Select(CurryTuple(resultSelector)); 
    } 

    private static Func<Tuple<TLeft, TRight>, TResult> CurryTuple<TLeft, TRight, TResult>(Func<TLeft, TRight, TResult> func) 
    { 
     return tuple => func(tuple.Item1, tuple.Item2); 
    } 

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

Любые идеи?

ответ

0

Я думаю, вы неправильно поняли, как работают реактивные соединения. Условием объединения является совпадение событий, а не двоичная операция, которую вы поставляете. В основном каждое событие получает привязанную к нему продолжительность, а также объединяются события из левого и правого источников, которые существуют в одно и то же время. Have a look at this video для больше информация.

Результатом реактивного соединения является декартово произведение, если длительность не заканчивается - как вы сделали их в своем образце. То, что вы делаете, приведет к очень низким характеристикам производительности.

Можете ли вы предоставить мраморные диаграммы, модульные тесты и/или примерные сценарии того, чего вы пытаетесь достичь?

Я подозреваю, что будет лучший способ без использования Join.

+0

Спасибо - я неправильно понял присоединения. Похоже, RX - это не золотой молот для этой работы. – Jonny

Смежные вопросы