[英]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.