سؤال

وأنا حاليا على تطوير تطبيق التي تستخدم مساحة الاسم System.DirectoryServices لإنشاء كائن DirectoryEntry وحلقة من خلال التسلسل الهرمي كامل لجمع المعلومات.

وأنا لا أعرف عدد الإدخالات طفل لكل كائن DirectoryEntry في التسلسل الهرمي، لذلك لا يمكن إنشاء عدد N من حلقات متداخلة لالعناكب من خلال الخاصية الأطفال

وهنا هو بلدي على سبيل المثال رمز زائف:

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

وسؤالي هو: ما هي أفضل طريقة لإنشاء حلقة لجمع المعلومات إذا كنت لا تعرف ذلك عدد من الدلائل الفرعية في وجوه الخاص بك؟

(ويمكن تطبيق هذا على أي نوع الكائن الذي كنت لا تعرف التسلسل الهرمي الكائن)

هل كانت مفيدة؟

المحلول

استخدم دالة متداخلة إذا كنت لا تعرف عمق التسلسل الهرمي، وتحتاج إلى اجتياز أسفل من خلال جميع المستويات. فيما يلي مثال باستخدام اجتياز متعمقة الأول.

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

وبدلا من ذلك، دون العودية، يمكنك القيام اجتياز بإضافة قائمة الانتظار أو المكدس هيكل البيانات وتخزين الكائنات كنت قد رأيت ولكن طعاما زار حتى الان.

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

نصائح أخرى

لديك لكتابة وظيفة عودي كما ...

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

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

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

هل يمكن استخدام وظيفة التي تدعو بشكل متكرر نفسها على الأطفال.  حالة خروج: لا مزيد من الأطفال وما إلى ذلك ..

وخيار واحد هو استخدام العودية. تعيين هذا الرمز حتى في الوظيفة التي ثم تطلق على نفسها داخل حلقة foreach، ويمر الدليل التالي (البند الطفل) في كل مرة

ومرحبا بكم في عالم رائع من العودية. كنت في حاجة الى وظيفة يقبل دليل كحجة. وبالنظر إلى أن الدليل، فإنه يبحث عن كل من الطفل الدلائل ولكل واحد ... تطلق على نفسها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top