c#中的observable有if / then / else运算符吗?

时间:2017-04-11 13:11:02

标签: c# .net system.reactive

有没有人知道这个手工 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 */ }));

2 个答案:

答案 0 :(得分:3)

是的,有一个:https://github.com/Reactive-Extensions/Rx.NET/blob/develop/Rx.NET/Source/src/System.Reactive/Linq/Observable/If.cs

但为什么不使用自制版?它对我来说似乎很有效。

遗憾的是,据我所知,在.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,因为投影和合并是它的主要功能。