Реактивные Расширения имеет метод расширения: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);
}
Как я использую это еще мне интересно, если я мог бы потребовать более подобных методов (возможно, внешние соединения - все, что означает, что для наблюдаемых). Вместо того, чтобы пытаться реализовать их все (и принести потенциальную возможность для ошибок и субоптимального кода), мне было интересно, есть ли у кого-то другая проблема и есть ли библиотеки, которые уже были написаны.
Любые идеи?
Спасибо - я неправильно понял присоединения. Похоже, RX - это не золотой молот для этой работы. – Jonny