我对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#中实现这一目标?对不起,如果我错过了其他地方的样本。
答案 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对每个列表进行排序并将它们压缩在一起。