Помогите написать алгоритм для структуры папок - PullRequest
0 голосов
/ 15 сентября 2011

Я использую MongoDB, и мне нужно написать алгоритм для заполнения следующих классов, чтобы построить структуру каталогов дерева:

public class Dir 
{
    public string name { get; set; }
    public string hash { get; set; }
    public bool read { get; set; }
    public bool write { get; set; }
    public Dir[] dirs { get; set; }
}

Я получу из MongoDB список строк папок, подобных этой, различный и отсортированный (пустая строка - корень):

 Folder1
 Folder2
 Folder2/ChildFolder
 Folder2/ChildFolder2
 Folder2/ChildFolder3
 Folder2/ChildFolder3/Folderrrr
 Folder2/ChildFolder3/Hi
 ""

У меня должен быть объект Dir, который является корневой папкой, и внутри него у меня должен быть массив каталогов, в каждом каталоге, который я могесть другой массив каталогов и так далее ...

Есть идеи?Спасибо за любую помощь

Ответы [ 2 ]

6 голосов
/ 15 сентября 2011

Прекрасно работает с данными вашего примера, но может потребоваться внести некоторые изменения в будущем

    static void Main(string[] args)
    {
        var folders = new[] { "Folder1","Folder2","Folder2/ChildFolder","Folder2/ChildFolder2","Folder2/ChildFolder3",
                              "Folder2/ChildFolder3/Folderrrr", "Folder2/ChildFolder3/Hi"
                            };
        var root = new Dir("Root");
        foreach (var folder in folders)
        {
            BuildTree(folder, root);
        }
    }

    private static void BuildTree(string path, Dir parent)
    {
        if (parent == null) return;

        if (path.Contains("/"))
        {
            var dir = path.Substring(0, path.IndexOf("/"));
            var newPath = path.Substring(dir.Length + 1);
            Dir addNodeTo;
            if (!parent.Contains(dir))
            {
                var newParent = new Dir(dir);
                parent.Dirs.Add(newParent);
                addNodeTo = newParent;
            }
            else
            {
                addNodeTo = parent.Get(dir);
            }
            BuildTree(newPath, addNodeTo);
        }
        else
        {
            if (!parent.Contains(path))
                parent.Dirs.Add(new Dir(path));
        }
    }

 public class Dir
 {
    public string Name { get; private set; }
    public string Hash { get; set; }
    public bool Read { get; set; }
    public bool Write { get; set; }
    public List<Dir> Dirs { get; private set; }

    public Dir(string name)
    {
        Name = name;
        Dirs = new List<Dir>();
    }

    public bool Contains(string name)
    {
        return Dirs.Any(d => d.Name.Equals(name));
    }

    public Dir Get(string name)
    {
        return Dirs.FirstOrDefault(d => d.Name.Equals(name));
    }

    public override string ToString()
    {
        return Name;
    }
}
0 голосов
/ 15 сентября 2011

Вам не нужно иметь отдельный класс Tree. Поскольку сам корень является каталогом. Так что только Dir сделает.

Плюс, лучше использовать список вместо массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...