关于如何有效地分组/过滤list/seq的快速问题.
我使用最好的方法吗?
谢谢!
type tmp = {
A : string
B : int option }
type tmp2 = {
A : string
B : int }
let inline getOrElse (dft: 'a) (x: 'a option) =
match x with
| Some v -> v
| _ -> dft
let getGrouped (l: tmp list) =
l |> List.filter (fun a -> a.B.IsSome)
|> List.map (fun a -> {A = a.A ; B = (getOrElse 0 (a.B)) })
|> List.groupBy (fun a -> a.A)
Run Code Online (Sandbox Code Playgroud)
涉及到map+filterwhen 的最自然的方法option是使用choose,它结合了这两个操作并从过滤后的输出中删除选项包装器.
你的例子看起来像这样:
let getGrouped (l: tmp list) =
l
|> List.choose (fun a ->
a.B
|> Option.map (fun b -> {A = a.A; B = b})
|> List.groupBy (fun a -> a.A)
Run Code Online (Sandbox Code Playgroud)