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