>有谁知道这个手工制作的 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 */ }));
是的,有一个:https://github.com/Reactive-Extensions/Rx.NET/blob/develop/Rx.NET/Source/src/System.Reactive/Linq/Observable/If.cs
但是为什么不使用您的自制版本呢?它似乎对我来说效果很好。
可悲的是,据我所知,.Net 中没有用于此任务的内置运算符。
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>
s 的扩展方法。
对我来说,您的手工If
操作员看起来更像是SelectMany
运算符的变体。我会把它命名为SelectMany
,因为投影和合并是它的主要功能。