F#:过滤没有,只保留一些

Jef*_*_hk 3 f#

关于如何有效地分组/过滤list/seq的快速问题.

  1. 仅筛选可选字段不为None的记录
  2. 删除"option"参数以使将来的进程更容易(因为None已被过滤掉)
  3. 小组(我相信这没问题)

我使用最好的方法吗?

谢谢!

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)

scr*_*wtp 7

涉及到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)