2017-03-20 10 views
0

IObservableの子プロパティを持つオブジェクトのIObservableが与えられている場合、メインオブザーバブルをフィルタリングして、のアイテム。子オブザーバブルに少なくともx個のアイテムがあるオブザーバブルをフィルタリングする方法

たとえば、次のテストケースには、2つのMyClassを含むIObservableがあります。最初のものは5つの整数と2の2番目のオブザーバブルが含まれています。だから私の質問は、4つ以上の数値を含むインスタンスだけを含むMyClassのIObservableをフィルタリングする方法ですか?

[TestClass] 
public class TestClass 
{ 
    public class MyClass 
    { 
     public IObservable<int> Numbers { get; set; } 
    } 

    [TestMethod] 
    public void Test() 
    { 
     //Arrange  
     var data = new [] 
     { 
      new MyClass() 
      { 
       Numbers = new Observable.Range(100, 5) 
      }, 
      new MyClass() 
      { 
       Numbers = new Observable.Range(200, 2) 
      } 
     }; 

     var observableData = data.ToObservable(); 

     //Act 
     //TODO: set filtered so that it includes 
     // all instances of MyClass which have 4 
     // or more items in Numbers 
     IObservable<List<MyClass>> filtered = observableData 

     //Assert 
     IObservable<List<MyClass>> observableResult = 
      filtered.Aggregate(new List<MyClass>(), 
       (l, o) => 
        { 
         l.Add(o); 
          return l; 
        }); 

     var result = observableResult.Wait(); 
     //expected result should include data[0] because 
     // is contains 5 numbers but exclude data[1] 
     // because it only contains 2. 
     var expected = new List<MyClass>() { data[0] }; 

     CollectionAssert.AreEquivalent(expected, result); 
    } 
} 

助けていただければ幸いです。

答えて

0

ソリューション:英語で

IObservable<MyClass> filtered = observableData 
    .SelectMany(c => c.Numbers 
     .Skip(3) 
     .Take(1) 
     .Select(_ => c) 
    ); 

MyClassのインスタンスごとに、最初の3つの数字をスキップ観察を産生するが、その後、いずれかをとります。番号はMyClassの元のインスタンスにマップされます。我々はSelectManyを使って、生成された観測値を1つにまとめる。

+0

Ah、Take(1)。それが私が欠けていた部分です。一度あなたがどのように知っているか分かります:) – 1adam12

関連する問題