繁体   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