2016-05-10 134 views
0

我有四個數據源通過一個公共ID(遞增整數)關聯。合併來自不同源的不同類型的數據

一個數據源P始終可用,其他三個L對於給定ID(即ID不能保證存在)可用或不可用,並通過互聯網接收,並且可通過其IP地址進行區分。

我收集了一段時間內的數據源,然後我想用他們的ID加入他們。

我的心智模式是在區間P: List<'T>

  • 的數據是這樣的

    • 數據從源P所有L來源:L: List<Dictionary<string, 'U>>
    • 從源頭獲取ID Pa: 'T -> int
    • L獲取ID來源b: 'U -> int
    • 產生的類型,其中數據之前,我橫行使用哈希集和諸如此類的東西相組合'V = {Id: int; P: 'T; L: Dictionary<string, 'U> }
    • 結果R: List<'V>

    ,這將是很好得到關於如何做到這一點的一些想法。也許有一些很酷的F#功能,這使得這非常簡單。

  • +1

    這個問題並不完全清楚 - 你寫道Ls可能可用於給定的ID,但是你從L獲得ID的呼叫是由「U」鍵控的? –

    +0

    @AntonSchwaighofer來自'L'源的數據都是相同的類型,'U',並假定包含該ID。 'a'和'b'從數據類型「T」和「U」中提取ID。 – kasperhj

    +0

    如果我假設你的意思是'a:int - >'T',並且對於'b',我寧願將它建模爲'{Id:int; P:'T; L:Map }'。我不明白你爲什麼需要一個字典列表? –

    回答

    2

    我認爲你可以更直接地將你的域模型翻譯成F#中的類型。

    一個數據源P是始終可用的和其他三人L'S可以或 可以不爲給定的ID是可用的(存在即ID的,不能保證 )和在互聯網上被接收並且是可區分由 他們的IP地址。

    這個描述了F#中的記錄類型,非常整潔。

    type MyDataSources = 
        {Id: int; 
        P : MyDataSource; 
        L1: MyOtherDataSource option; 
        L2: MyOtherDataSource option; 
        L3: MyOtherDataSource option;} 
    

    我收集的數據源在幾個間隔,然後我想使用他們的ID 加入他們的行列。

    因此,我們需要另一種記錄類型的數據。

    type JoinedData<'T, 'U> = 
        {PData : 'T list; 
        L1Data : 'U list option; 
        L2Data : 'U list option; 
        L3Data : 'U list option;} 
    

    然後,我們只需要一個接收數據源並填充數據的函數。

    let populateDataFromSources dataSources = 
        {PData = getDataFrom dataSources.P // replace with whatever logic you want here 
        .... 
        } 
    

    如果需要,你的getDataFrom功能可能需要從數據源的Id作爲參數,並篩選數據返回其涉及Id(例如)。

    +0

    我很欣賞這裏的邏輯,但在我看來,合併問題推遲到'populateDataFromSources'。我在想也許有一個很好的方法來「連接」源代碼,這樣我就不必從頭開始編寫合併了。 – kasperhj

    +0

    @kasperhj您可以使用上述方法強烈引用數據源,您不需要任何種類的基於「Id」的複雜連接/合併。在絕對最壞的情況下,數據源會返回適用於多個「Id」的數據,在這種情況下,您需要的唯一邏輯就是「過濾器」。 – TheInnerLight

    +0

    但是,你將如何構建'MyDataSources'? 'P'有和id必須與'Lx'匹配。 – kasperhj

    相關問題