2011-12-21 360 views
1

我對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#做到這一點?對不起,如果我錯過了其他地方的樣本。

回答

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

是的 - 他們都排序和完全相同的長度 - 關於同一組織的數據,只是通過不同的輸入(不是我的設計...) –

+0

然後這應該工作得很好。 – Daniel

+0

謝謝丹尼爾,那樣做。 –

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 
0

也許你可以通過ID進行排序各列表和它們壓縮如果所有列表都具有相同的ID集合。

+0

他想 - 你最終會得到一個'(L1 * L2 * L3)列表'。它還要求所有三個輸入具有相同的長度 –

+0

Zip不是最後一個操作,您還需要將元組映射到所需的最終數據。 –