从分组的 Observable 中提取值
Extracting the values from an IGroupedObservable
Reactive.Linq 的 GroupBy
给你留下了 IObservable<IGroupedObservable<'TKey, 'TValue>>
。如何从 IGroupedObservable 获取值? x.Key
可以访问密钥,所以我想可以通过某种转换来投影这些值。
这大概就是我想做的事情:
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
。
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
。您需要删除其返回值才能使调用正常工作。
Reactive.Linq 的 GroupBy
给你留下了 IObservable<IGroupedObservable<'TKey, 'TValue>>
。如何从 IGroupedObservable 获取值? x.Key
可以访问密钥,所以我想可以通过某种转换来投影这些值。
这大概就是我想做的事情:
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
。
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
。您需要删除其返回值才能使调用正常工作。