我有一个这样的列表
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
它不起作用。
答案 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;}]