سؤال

في ما يلي C # البرمجية المتكررة
لدي "while" حلقة داخل حلقة "foreach" وأتمنى للانتقال إلى العنصر التالي في "foreach" عند حدوث حالة معينة.

foreach (string objectName in this.ObjectNames)
{
    // Line to jump to when this.MoveToNextObject is true.
    this.ExecuteSomeCode();
    while (this.boolValue)
    {
        // 'continue' would jump to here.
        this.ExecuteSomeMoreCode();
        if (this.MoveToNextObject())
        {
            // What should go here to jump to next object.
        }
        this.ExecuteEvenMoreCode();
        this.boolValue = this.ResumeWhileLoop();
    }
    this.ExecuteSomeOtherCode();
}
أن

'continue "القفز إلى بداية حلقة" while' لا 'foreach "حلقة. هل هناك كلمة رئيسية لاستخدام هنا، أو ينبغي أن مجرد استخدام غوتو التي أنا لا أحب حقا.

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

المحلول

وفيما يلي يجب أن تفعل خدعة

foreach (string objectName in this.ObjectNames)
{
    // Line to jump to when this.MoveToNextObject is true.
    this.ExecuteSomeCode();
    while (this.boolValue)
    {
        if (this.MoveToNextObject())
        {
            // What should go here to jump to next object.
            break;
        }
    }
    if (! this.boolValue) continue; // continue foreach

    this.ExecuteSomeOtherCode();
}

نصائح أخرى

استخدم الكلمة الشوط الاول. وهذا الخروج من حلقة في حين ومتابعة تنفيذ خارجها. منذ لم يكن لديك أي شيء بعد حين، أنه سيكون حلقة حول إلى العنصر التالي في حلقة foreach.

والواقع، والنظر في المثال الخاص بك عن كثب، كنت فعلا تريد أن تكون قادرة على دفع لحلقة من دون أن تخرج من حين لاخر. لا يمكنك أن تفعل هذا مع حلقة foreach، ولكن يمكنك كسر حلقة foreach إلى ما بأتمتة الواقع. في. NET، يتم تقديم حلقة foreach في الواقع بمثابة دعوة .GetEnumerator () على الكائن IEnumerable (أي كائن this.ObjectNames الخاص بك هو).

ووحلقة foreach هي في الأساس هذا:

IEnumerator enumerator = this.ObjectNames.GetEnumerator();

while (enumerator.MoveNext())
{
    string objectName = (string)enumerator.Value;

    // your code inside the foreach loop would be here
}

وبمجرد الانتهاء من هذا الهيكل، يمكنك الاتصال enumerator.MoveNext () داخل حلقة في حين الخاص بك للانتقال إلى العنصر التالي. لذا التعليمات البرمجية سوف تصبح:

IEnumerator enumerator = this.ObjectNames.GetEnumerator();

while (enumerator.MoveNext())
{
    while (this.ResumeWhileLoop())
    {
        if (this.MoveToNextObject())
        {
            // advance the loop
            if (!enumerator.MoveNext())
                // if false, there are no more items, so exit
                return;
        }

        // do your stuff
    }
}

والكلمة break; وخروج حلقة:

foreach (string objectName in this.ObjectNames)
{
    // Line to jump to when this.MoveToNextObject is true.
    while (this.boolValue)
    {
        // 'continue' would jump to here.
        if (this.MoveToNextObject())
        {
            break;
        }
        this.boolValue = this.ResumeWhileLoop();
    }
}

استخدم goto.

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

ويمكنك استخدام "كسر"؛ للخروج من الوقت أو foreach الأعمق.

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