合并不同的“类型”列表

时间:2011-12-21 02:12:20

标签: f# merge

我对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个列表合并为一个 - 基于公共ID - 列表如下:

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

我如何在F#中实现这一目标?对不起,如果我错过了其他地方的样本。

3 个答案:

答案 0 :(得分:2)

假设它们已经排序并且长度相等(如果不是这种情况,我不确定合并结果应该):

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 })

答案 1 :(得分:0)

我认为这就是你想要的 - 一个有区别的联盟

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

答案 2 :(得分:0)

如果所有列表都具有相同的ID集,也许您可​​以按ID对每个列表进行排序并将它们压缩在一起。