2017-11-17 3 views
0

コードが話しをやらせるので、病気の私のRx質問を説明するのはその困難:ReactiveExtensionsでは要素のエンベロープから要素を選択する方法は?いつものよう

public class Feature 
{ 
    public ReactiveProperty<bool> IsRunning = new ReactiveProperty<bool>(false); 
} 

public class MyHelpers 
{ 
    public static ReadOnlyReactiveProperty<Feature> GetRunningFeature(IEnumerable<Feature> features) 
    { 
     // How do I return the latest running feature? 
     // AND support disposing so no memory leaks 
    } 
} 

public class TestMyHelpers 
{ 
    public void Tests() 
    { 
     var features = new List<Feature>() {new Feature(), new Feature(), new Feature()}; 
     var running = MyHelpers.GetRunningFeature(features); 

     features[1].IsRunning.Value = true; 
     Assert.AreEqual(features[1], running.Value); 

     features[2].IsRunning.Value = true; 
     Assert.AreEqual(features[2], running.Value); 

     features[2].IsRunning.Value = false; 
     Assert.AreEqual(features[1], running.Value); 

     features[1].IsRunning.Value = false; 
     Assert.AreEqual(null, running.Value); 
    } 
} 

は基本的に私は私の特徴のIEnumerableをの初期入力与えられた最新の実行機能を返すソリューションをしたいし、それを行いますメモリをリークしない方法で?

誰もが考えている?

答えて

0

ああ、私は答えを見つけたと思うが、誰が提案するイム開いそれを行うためのより良い方法を知っている場合:

public static ReadOnlyReactiveProperty<Feature> GetRunningFeature(IEnumerable<Feature> features) 
     { 
      return Observable.Create<Feature>(obs => 
       { 
        var disposables = new CompositeDisposable(); 

        foreach (var feature in features) 
         feature.IsRunning.Subscribe(_ => 
           obs.OnNext(features.First(f => f.IsRunning.Value))) 
          .AddTo(disposables); 

        return Disposable.Create(() => disposables.Dispose()); 
       }) 
       .ToReadOnlyReactiveProperty(); 
     } 
関連する問題