有没有人知道这个手工 if / then / else运算符是否适当替换了响应式扩展名(.Net / C#)?
public static IObservable<TResult> If<TSource, TResult>(
this IObservable<TSource> source,
Func<TSource, bool> predicate,
Func<TSource, IObservable<TResult>> thenSource,
Func<TSource, IObservable<TResult>> elseSource)
{
return source
.SelectMany(
value => predicate(value)
? thenSource(value)
: elseSource(value));
}
用法示例(假设numbers
的类型为IObservable<int>
:
numbers.If(
predicate: i => i % 2 == 0,
thenSource: i => Observable
.Return(i)
.Do(_ => { /* some side effects */ })
.Delay(TimeSpan.FromSeconds(1)), // some other operations
elseSource: i => Observable
.Return(i)
.Do(_ => { /* some other side effects */ }));
答案 0 :(得分:3)
但为什么不使用自制版?它对我来说似乎很有效。
遗憾的是,据我所知,在.Net中没有为此任务构建运算符。
答案 1 :(得分:1)
Rx 中有一个 If
运算符,具有以下签名:
// If the specified condition evaluates true, select the thenSource sequence.
// Otherwise, return an empty sequence.
public static IObservable<TResult> If<TResult>(Func<bool> condition,
IObservable<TResult> thenSource);
// If the specified condition evaluates true, select the thenSource sequence.
// Otherwise, return an empty sequence generated on the specified scheduler.
public static IObservable<TResult> If<TResult>(Func<bool> condition,
IObservable<TResult> thenSource, IScheduler scheduler);
// If the specified condition evaluates true, select the thenSource sequence.
// Otherwise, select the elseSource sequence.
public static IObservable<TResult> If<TResult>(Func<bool> condition,
IObservable<TResult> thenSource, IObservable<TResult> elseSource);
它不是 IObservable<T>
的扩展方法。
您手工制作的 If
运算符在我看来更像是 SelectMany
运算符的变体。我会把它命名为 SelectMany
,因为投影和合并是它的主要功能。