Frage

Ich bin derzeit die Entwicklung eine Anwendung, die den System.DirectoryServices-Namespace verwenden, um ein Objekt Directory und Schleife durch die gesamte Hierarchie zu erstellen, um Informationen zu sammeln.

Ich weiß nicht, Anzahl der untergeordneten Einträge für jedes Directory Objekt in der Hierarchie, so kann ich nicht eine Anzahl von N verschachtelten Schleifen Spinnen durch die Kinder Eigenschaft

erstellen

Hier ist mein Pseudo-Code-Beispiel:

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

Meine Frage ist, was ist der beste Weg, um eine Schleife zu sammeln Informationen zu erstellen, wenn Sie so nicht die Anzahl der Unterverzeichnisse in Ihrem Objekt wissen?

(Dies kann auf jede Art von Objekt angewandt werden, dass Sie die Objekthierarchie nicht kennen)

War es hilfreich?

Lösung

eine rekursive Funktion verwenden, wenn Sie die Tiefe der Hierarchie nicht kennen und müssen durch alle Ebenen zu durchqueren nach unten. Unten ist ein Beispiel depth-first-Traversal verwendet wird.

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

Alternativ ohne Rekursion können Sie eine Traversal tun, indem Sie eine Queue oder Stack-Datenstruktur Hinzufügen und Speichern der Objekte, die Sie gesehen haben, aber noch besucht haben.

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

Andere Tipps

Sie müssen rekursive Funktion schreiben, wie ...

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

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

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

Sie könnten eine Funktion verwenden, die rekursiv selbst auf die Kinder nennt.  Ausgangsbedingung: keine Kinder mehr etc ..

Eine Option ist Rekursion zu verwenden. Stellen Sie diesen Code oben in einer Funktion, die dann innerhalb der foreach-Schleife nennt mich, vorbei an das nächste Verzeichnis (untergeordnetes Element) jedes Mal

Willkommen in der wunderbaren Welt der Rekursion. Sie müssen eine Funktion, die ein Verzeichnis als Argument akzeptiert. Da Verzeichnis sieht es alle untergeordneten Verzeichnisse und für jeden ... nennt sich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top