2011-11-14 12 views
6

私には私が制御できないイベントがあり、私にデータを提供しています。 eventArgsは次のようになります。イベントの条件に応じてRx Observableを完了する方法

class MyEventArg { 
    bool IsLastItem {get;} 
    Data DataItem {get;} 
} 

私はこのイベントをIObservableに変換するためにRxを使用します。しかし、私はIsLastItemが真である場合にobservableを完成させたい。

優雅なアイデアはありますか? 1つの方法は、条件が発生した場合にOnCompleteイベントを設定するために、より多くの制御を持つ対象を介してデータをパイプすることです。

答えて

9

あなたは最後の要素が含まれるようにしたい場合は、一緒にTakeWhileと組み合わせる通常の流れで最後の要素だけでストリームをマージすることができますに。

var subject = new List<string> 
{        
"test", 
"last" 
}.ToObservable(); 

var my = subject 
      .Where(x => x == "last").Take(1) 
      .Merge(subject.TakeWhile(x => x != "last")); 

my.Subscribe(
    o => Console.WriteLine("On Next: " + o), 
    () => Console.WriteLine("Completed")); 

Console.ReadLine(); 

この版画:ここ は、それを証明するために、単純なコンソールアプリケーションです

On Next: test 
On Next: last 
Completed 

UPDATE根本的な観察可能が実際に完了しなかった場合OnCompletedメッセージをsupressedバグがありました 。

var my = subject.Publish(p => p 
      .Where(x => x == "last").Take(1) 
      .Merge(p.TakeWhile(x => x != "last"))); 
+0

ニース!それがどのように行われたかを見て私に数秒かかりました。 (x => x!= "last")。マージ(subject = x == "last")。 寒い目に見える先端は+です。ありがとう – lukebuehler

2

このようなものをお探しですか?

IObservable<MyEventArg> result = 
    myEventArgObservable.TakeWhile(arg => !arg.IsLastItem); 
+0

うわー、それだろう:私はOnCompleted

呼び出さそして、あなたは冷たい観測のための基本となるシーケンスに加入して複数回を回避したい場合は、このようなコードをリファクタリングすることができます確保するためにコードを修正しましたシンプルで素敵です。述語が真であればObservableが完了するかどうか知っていますか? – lukebuehler

+0

はい、OnCompleted()に通知する必要がない場合は、OnCompleted()に通知します。WhereCompletedを使用すると、Where(arg =>!arg.IsLastItem) – Christoph

+1

はい、Observableが完了したようですが、私は最後のアイテムを受け取ることはありません... – lukebuehler

2
public static IObservable<TSource> TakeWhileInclusive<TSource>(
     this IObservable<TSource> source, Func<TSource, bool> predicate) 
{ 
    return Observable 
     .Create<TSource>(o => source.Subscribe(x => 
                { 
                 o.OnNext(x); 
                 if (!predicate(x)) 
                  o.OnCompleted(); 
                }, 
               o.OnError, 
               o.OnCompleted 
           )); 
} 
関連する問題