簡體   English   中英

F#導航對象圖以返回特定的節點

[英]F# Navigate object graph to return specific Nodes

我正在嘗試基於DataSet中的DataRelations構建一個DataTables列表,其中返回的表僅通過它們彼此之間的關系包括在內,並提前知道鏈的每個末端。 這樣我的數據集就有7個表。 關系看起來像這樣:

Table1 -> Table2 -> Table3 -> Table4 -> Table5
                           -> Table6 -> Table7

因此,鑒於表1和表7,我想返回表1、2、3、6、7

到目前為止,我的代碼遍歷了所有關系並返回了所有Tables,因此在示例中,它也返回了Table4和Table5。 我已經傳遞了第一個,最后一個作為參數,並且知道我還沒有使用最后一個,我仍在嘗試思考如何解決這個問題,這是我需要幫助的地方。

type DataItem =
    | T of DataTable
    | R of DataRelation list

let GetRelatedTables (first, last) =
    let rec flat_rec dt acc =
        match dt with
        | T(dt)   -> 
            let rels = [ for r in dt.ParentRelations do yield r ]
            dt :: flat_rec(R(rels)) acc             
        | R(h::t) -> 
            flat_rec(R(t)) acc @ flat_rec(T(h.ParentTable)) acc
        | R([])   -> []
    flat_rec first []

我認為類似的方法可以做到(盡管我還沒有測試過)。 它返回DataTable list option因為從理論上講,兩個表之間的路徑可能不存在。

let findPathBetweenTables (table1 : DataTable) (table2 : DataTable) =
    let visited = System.Collections.Generic.HashSet() //check for circular references
    let rec search path =
        let table = List.head path
        if not (visited.Add(table)) then None
        elif table = table2 then Some(List.rev path)
        else 
            table.ChildRelations
            |> Seq.cast<DataRelation>
            |> Seq.tryPick (fun rel -> search (rel.ChildTable::path))
    search [table1]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM