2017-03-20 19 views
0

如果有IObservable子項的IObservable對象,那麼如何篩選主觀察值以僅包含子屬性至少具有X個數的實例項目。如何篩選子可觀察項至少有x項的Observable

例如,以下測試用例具有包含2個MyClass的IObservable。第一個包含5個整數的可觀察值和2的第二個。所以我的問題是如何過濾MyClass的IObservable以僅包含包含4個或更多數字的實例?

[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將生成的觀察值平鋪爲一個。

+0

啊,拿(1)。這是我失蹤的部分。很明顯,一旦你知道如何:)非常感謝。 – 1adam12