2017-04-11 11 views
5

手作り反応拡張(.Net/C#)のif/then/else演算子の適切な置換えを知っている人はいますか?C#のobservablesのif/then/else演算子はありますか?

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

このようにしますか? https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/if.md ... opps、JSはC#ではなく、申し訳ありません。 – AndyJ

+0

ここにC#のバージョンがあります:https://github.com/Reactive-Extensions/Rx.NET/blob/develop/Rx.NET/Source/src/System.Reactive/Linq/Observable/If.cs – AndyJ

+1

はい、これです1つは「内部」です。 –

答えて

3

がはいそこです:

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>のでしょうか?https://github.com/Reactive-Extensions/Rx.NET/blob/develop/Rx.NET/Source/src/System.Reactive/Linq/Observable/If.cs

しかし、なぜ、あなたの自作のバージョンを使用していない非常にうまく機能しているようです

悲しいことに、私の知る限りでは、この作業のための.NETの構築はありません。

+1

この実装は 'internal'と思われます。私は公開の 'If'拡張メソッドを見つけることができませんでした。 –

関連する問題