2010-12-08 44 views
2

一個ForkJoin的結果:彙總鑑於這一段代碼中的Rx

var loadAll = 
    Observable.ForkJoin(
     service1.FindBooksAsObservable().Select(s => s), 
     service2.FindBooksAsObservable().Select(s => s), 
     service3.FindBooksAsObservable().Select(s => s) 
); 

loadAll.Subscribe(
    result => 
    { 
     var aggregatedListOfBooks = result.SelectMany(b => b); 
    }); 

正如可以看到的,問題是每個FindBooksAsObservable()方法中返回一個IObservable<IEnumerable<Book>>,因此結果可變訂閱()是一個數組IEnumerable<Book>

有沒有其他的方法來彙總的結果ForkJoin()?我希望能使用像Merge()以及ForkJoin。

回答

3

假設所有三個服務返回的Books列表,你可以使用SelectMany合併列表:

IObservable<Book> loadAll = 
    Observable.ForkJoin(
     service1.FindBooksAsObservable().Select(s => s), 
     service2.FindBooksAsObservable().Select(s => s), 
     service3.FindBooksAsObservable().Select(s => s) 
    ) 
    .Select(books => books.SelectMany(list => list).ToList()); 

loadAll.Subscribe(
    book => { /* will be called once with a single list of all items */ }); 

可以刪除ToList()通話,如果你不需要輸出是一個列表。

+0

沒有,居然要我想是從所有服務中得到的所有書籍在一個單一的列表。 – 2010-12-11 12:25:49