Question

Je développe actuellement une application qui utilise l'espace de noms System.DirectoryServices pour créer un objet DirectoryEntry et boucle à travers toute la hiérarchie de recueillir des informations.

Je ne sais pas le nombre d'entrées de l'enfant pour chaque objet DirectoryEntry dans la hiérarchie, donc je ne peux pas créer un nombre N de boucles imbriquées pour les araignées à travers la propriété Enfants

Voici mon pseudo exemple de code:

//root directory
DirectoryEntry root = new DirectoryEntry(path);

if(DirectoryEntry.Childern != null)
{
    foreach(DirectoryEntry child in root.Children)
    {
        //loop through each Children property unitl I reach the last sub directory
    }
}

Ma question est, quelle est la meilleure façon de créer une boucle pour recueillir des informations si vous le connaissez pas le nombre de sous-répertoires dans votre objet?

(Ceci peut être appliqué à tout type d'objet que vous ne connaissez pas la hiérarchie d'objets)

Était-ce utile?

La solution

Utilisez une fonction récursive si vous ne connaissez pas la profondeur de la hiérarchie et la nécessité de traverser à travers tous les niveaux. Ci-dessous un exemple en utilisant traversal profondeur d'abord.

using (DirectoryEntry root = new DirectoryEntry(someDN))
{
    DoSomething(root);
}


function DoSomething(DirectoryEntry de)
{
    // Do some work here against the directory entry

    if (de.Children != null)
    {
        foreach (DirectoryEntry child in de.Children)
        {
            using (child)
            {
                DoSomething(child);
            }
        }
    }
}

Sinon, sans récursion, vous pouvez le faire en ajoutant une traversal une structure de données de file d'attente ou la pile et le stockage des objets que vous avez vu, mais havent encore visité.

Queue<DirectoryEntry> queue = new Queue<DirectoryEntry>();
DirectoryEntry root = new DirectoryEntry(someDN);
queue.Add(root);

while (queue.Any())
{
    using (DirectoryEntry de = queue.Dequeue())
    {
        // Do some work here against the directory entry

        if (de.Children != null)
        {
            foreach (DirectoryEntry child in de.Children)
            {
                queue.Enqueue(child);
            }
        }
    }
}

Autres conseils

Vous devez écrire la fonction récursive ...

DirectoryEntry root = new DirectoryEntry(path);
DoForEveryNode(root);

void DoForEveryNode(DirectoryEntry node)
{
    // do something..

    foreach(DirectoryEntry child in node.Children)
    {
        DoForEveryNode(child);
    }
}

Vous pouvez utiliser une fonction qui appelle elle-même récursive sur les enfants.  condition de sortie: les enfants ne plus etc ..

Une option consiste à utiliser la récursivité. Définir ce code dans une fonction qui alors appelle lui-même dans la boucle foreach, passer le répertoire suivant (élément enfant) à chaque fois

Bienvenue dans le monde merveilleux de la récursivité. Vous avez besoin d'une fonction qui accepte un répertoire comme argument. Compte tenu de ce répertoire, il recherche tous les répertoires enfants et pour chacun ... lui-même appelle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top