Удалить некоторые из списка f # - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть такой список

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 ]

1 голос
/ 18 апреля 2019

Вы можете использовать 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;}]
1 голос
/ 18 апреля 2019

Вы действительно хотите отобразить элементы списка в другой тип. Поскольку используемая вами запись в списке выглядит как

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, задав ему значение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...