Объединять разные списки типа - PullRequest
1 голос
/ 21 декабря 2011

Я относительно новичок в F #, но до сих пор очень впечатлен этим, и, несмотря на то, что потратил много времени на поиск и просмотр принадлежащих мне книг, я пока не могу найти пример следующего: У меня есть 3 (или более того) списки, которые создаются из разных источников ввода: базы данных, файлов CSV и т. д. Предположим, что для этих списков существует следующая структура:

type L1 = {
    Id : int32   // Common id
    StringFieldA : string
    StringFieldB : string
}

type L2 = {
    Id : int32   // Common id
    Ratio: decimal
    StringFieldC : string
}

type L3 = {
    Id : int32    // Common id
    Mean: decimal
    StringFieldD : string
}

У меня есть методы, которые возвращают списки F # каждого из перечисленных выше,Теперь я хочу объединить 3 списка разных «типов» в один - на основе общего идентификатора - в список следующим образом:

type Merged = {
    Id : int32
    StringFieldA : string
    StringFieldB : string
    StringFieldC : string
    StringFieldD : string
    Mean: decimal
    Ratio: decimal
}

Как мне это сделать в F #?Извините, если я пропустил образец еще где.

Ответы [ 3 ]

2 голосов
/ 21 декабря 2011

Предполагая, что они отсортированы и имеют одинаковую длину (если это не так, я не уверен, какой будет результат объединения ):

List.zip3 l1 l2 l3 |> List.map (fun (l1, l2, l3) ->
  { Id = l1.Id
    StringFieldA = l1.StringFieldA
    StringFieldB = l1.StringFieldB
    StringFieldC = l2.StringFieldC
    StringFieldD = l3.StringFieldD
    Mean = l3.Mean
    Ratio = l2.Ratio })
0 голосов
/ 21 декабря 2011

Может быть, вы можете отсортировать каждый список по идентификатору и сжать их вместе, если весь список имеет одинаковый набор идентификаторов.

0 голосов
/ 21 декабря 2011

Я думаю, что это то, что вы хотите - дискриминационный союз

type Data = 
    |First of L1
    |Second of L2
    |Third of L3

, вы можете добавить члена Id, например

with member x.Id = 
    match x with
    |First(a) -> a.Id
    |Second(a) -> a.Id
    |Third(a) -> a.Id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...