2011-09-15 4 views
0

J'utilise MongoDB et je dois écrire un algorithme pour remplir les classes suivantes, pour construire une structure de répertoire des arbres:Aide à écrire un algorithme pour la structure des dossiers

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; } 
} 

je vais obtenir le formulaire MongoDB une liste chaînes des dossiers comme celui-ci, distincts et triés (chaîne vide est la racine):

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

je devrais avoir un objet Dir qui est le dossier racine, et à l'intérieur que celui que je devrais avoir un tableau de répertoires, sur chaque répertoire je pourrais avoir un autre tableau de répertoires et ainsi de suite ...

Une idée? Merci pour toute aide

+1

Avez-vous essayé la recherche google pour récursion? : D – MattDavey

+0

Est-ce une question MongoDB ou juste une question d'algorithme "comment puis-je transformer une liste de chaînes avec des chemins en une structure arborescente?" Avez-vous besoin de stocker cet arbre dans MongoDB ou juste en mémoire? –

+0

@Hightechrider J'utilise MongoDB, je viens de le mettre parce que quelqu'un pourrait m'aider à écrire une meilleure collection de documents et/ou à éviter Sql aide ... – elranu

Répondre

6

fonctionne très bien avec vos données par exemple, mais il peut être nécessaire de faire des mises à jour à l'avenir

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

Merci pour votre aide !! – elranu

+0

Vous êtes les bienvenus! – mironych

0

Vous n'auriez pas besoin d'avoir une classe Tree séparée. Parce que la racine elle-même est un répertoire. Donc, juste le Dir fera l'affaire.

De plus, il est préférable d'utiliser une liste plutôt qu'une matrice.

+0

oui ok .. je pourrais transformer Tree en dir, mais l'arry son besoin par un autre composant. Pas construit par moi. Une idée de comment écrire l'algorithme? – elranu

Questions connexes