从列表f#中删除一些

时间:2019-04-18 11:27:04

标签: list f#

我有一个这样的列表

let data = [{ A = "one"; B = 2020; C = Some 5L; D = None };
            { A = "two"; B = 2020; C = None; D = Some 3L}]

如何将C = Some 5L;替换为C = 5;

我想要这样->

[{ A = "one"; B = 2020; C = 5; D = null };
 { A = "two"; B = 2020; C = null; D = 3}]

我尝试了let newData = data |> List.choose id 它不起作用。

2 个答案:

答案 0 :(得分:1)

您实际上想将列表的元素映射为其他类型。由于您在列表中使用的记录看起来像

type X = {
  A: string
  B: int
  C: int option
  D: obj option
}

,您想拥有

type Y = {
  A: string
  B: int
  C: int
  D: obj option
}

(注意C的类型),您需要使用List.map使用将X类型映射为Y类型的函数来转换列表的元素。

data |> List.map (fun x -> { A = x.A; B = x.B; C = (x.C |> Option.defaultValue 0); D = x.D})

您必须通过为其设置默认值来正确处理C=None情况。

答案 1 :(得分:1)

您可以使用System.Nullable表示C#应该识别的可为空的类型。 另外,您将需要创建一个单独的记录类型,以使用可空字段表示数据。 我可以想象,离开F#世界并进入C#时,您需要进行这种交易。

type A  = { A:string; B: int; C: int64 option; D: int64 option}
type T  = { A2:string; B2: int; C2: System.Nullable<int64>; D2: System.Nullable<int64>}
let data = [{ A = "one"; B = 2020; C = Some 5L; D = None };
            { A = "two"; B = 2020; C = None; D = Some 3L}]

let getNullable (x: int64 option) =
  match x with
  | Some v -> System.Nullable(v)
  | None -> System.Nullable()


let nullablData (data : A list)= 
  data |> List.map (fun x -> {A2 = x.A; B2 = x.B; C2 = getNullable(x.C); D2 = getNullable(x.D)})

let res=  nullablData data

//result
//val res : T list = [{A2 = "one"; B2 = 2020; C2 = 5L; D2 = null;};
//                    {A2 = "two"; B2 = 2020; C2 = null; D2 = 3L;}]