【问题标题】:Creating a tree view with directories at the root在根目录创建树视图
【发布时间】:2012-07-28 20:09:57
【问题描述】:

我正在寻找一种方法来解决一个简单的问题,并找到了这个递归解决方案:https://stackoverflow.com/a/674119/536607

这很好,但它假设您有一个固定的起始根,然后在其下构建文件结构的其余部分。

我正在尝试提出一种基本相同的算法,除了没有第一个硬编码的根。例如,我有以下文件

Data/test.txt
Data/dir/results.txt
Another/image.jpg
file.dat

将产生以下树

Data
   test.txt
   dir
      results.txt
Another
   image.txt
file.dat

所以它几乎就像其他解决方案一样,除了我删除顶部根,然后将所有内容推回。但我想你真的不能那么容易做到(可以吗?那样会很方便)

这是我正在考虑的算法

  • 首先,照常拆分路径
  • 定义一个新方法,用于检查树视图是否包含一个键等于路径第一部分的节点(因为我们植根于目录)
  • 如果存在,则返回该节点。否则,创建节点并返回它
  • 现在将节点和路径的其余部分传递给另一个方法,该方法将在步骤 3 中找到的节点视为根并从那里开始。

听起来应该可以。对第二步不太清楚,因为如果文件根植于存储的任何位置怎么办?

【问题讨论】:

    标签: c# algorithm


    【解决方案1】:

    编写了所描述的算法。似乎按预期工作。不过不太确定路径中没有目录的文件。

    有人看到问题吗?

    // start by getting the root
    private void build_file_list(List<Entry> entries)
    {
        TreeNode root;
        string[] pathbits;
        for (int i = 0; i < entries.Count(); i++)
        {
            pathbits = entries[i].name.Split(Path.DirectorySeparatorChar);
            root = get_root(pathbits[0]);
            add_path(root, pathbits);
        }
    }
    
    // returns existing node or creates a new one as needed
    private TreeNode get_root(string key)
    {
        if (explorer_view.Nodes.ContainsKey(key))
            return explorer_view.Nodes[key];
        else
            return explorer_view.Nodes.Add(key, key);
    }
    
    // now we have our root so we can start building the rest
    private void add_path(TreeNode node, string[] pathbits)
    {
        for (int i = 1; i < pathbits.Count(); i++)
            node = add_node(node, pathbits[i]);
    }
    
    
    
    // just recursively build nodes until end of file path
    private TreeNode add_node(TreeNode node, string key)
    {
        if (node.Nodes.ContainsKey(key))
            return node.Nodes[key];
        else
            return node.Nodes.Add(key, key);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-25
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多