2015-12-23 35 views
2

Reactive.Linq的GroupBy會讓您產生一個IObservable<IGroupedObservable<'TKey, 'TValue>>。你如何從IGroupedObservable獲取值?鑰匙可以通過x.Key訪問,所以我想這些值可以通過某種類型的轉換來預測。從IGroupedObservable中提取值

這大致就是我想做的事:

open System.Reactive.Linq 

let doStuffWithEvenNumbers i = i*10 
let doStuffWithOddNumbers i = i*3 

let numbers = Observable.Range(0, 10) 
let groups = numbers.GroupBy(fun i -> i % 2 = 0) 

let subscription1 = groups.Where(fun i -> i.Key).Subscribe(doStuffWithEvenNumbers) 
let subscription2 = groups.Where(fun i -> not i.Key).Subscribe(doStuffWithOddNumbers) 

當然,這兩個let subscriptionX =行不會編譯,因爲我需要從IGroupedObservable<bool, int>int

回答

2

IGroupedObservable<'TKey, 'TValue>延伸IObservable<'TValue>,這就是你如何獲得價值。你的情況,你可以做,在許多方面:

// you can use SelectMany to 'flatten' the observable 
groups.Where(fun i -> i.Key).SelectMany(fun o -> o :> IObservable<int>).Subscribe(doStuffWithEvenNumbers) 

注意,訂閱調用採取Action,而在你的情況,你所定義的方法作爲Func。您需要刪除其返回的值以使該呼叫正常工作。

+0

'SelectMany(id)'是我的第一次嘗試,但是我得到錯誤'No overloads match for method'SelectMany''。如果我複製+逐字粘貼您的行,結果相同。 –

+0

更新了答案,您需要將'IGroupedObservable'上傳到'IObservable'(不隱含在F#中),同時也要注意您的訂戶方法需要更改。 '讓doStuffWithEvenNumbers我= printf「%i」我* 10' – Gluck