سؤال

لدي حلقة كبيرة جدًا تحتوي على 1000 صف.أخرج من الحلقة إذا تم العثور على القيمة السحرية 1.إذا لم يتم العثور على القيمة السحرية 1 ولكن تم العثور على القيمة السحرية 2، فستحتاج الحلقة إلى التخطي إلى البداية.أستخدم حاليًا رمز التبديل وبعض ifs وgoto.لقد قرأت أن goto ليس هو أفضل طريقة.هل هناك طريقة أفضل لإنجاز هذا العمل؟

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

المحلول

للخروج من الحلقة يمكنك استخدام استراحة بيان، للانتقال إلى السجل التالي يمكنك استخدام يكمل إفادة.

for(int i = 0; i < 1000; i++)
{
    if(magicValue1)
       break;
    if(magicValue2)
       continue;
}

أنا لا أتغاضى عن استخدام عبارة GOTO، بل أشير ببساطة إلى حالة استخدام محتملة

يمكنك استخدام اذهب إلى عبارة الانتقال لبدء/الخروج من الحلقة، ومع ذلك سأبقى بعيدًا عن هذا الخيار إلا إذا كنت تستخدمه حلقات متداخلة.أعتقد أن عبارة goto لا تزال لها استخداماتها للتحسين والخروج بشكل نظيف وما إلى ذلك.ولكن بشكل عام فمن الأفضل استخدامه تمامًا بشكل مقتصد.

for(int i = 0; i < 100; i++)
{ 
  start:

  for(int i = 0; i < 10; i++)
  {
     if(magicValue1)
       goto end;
    if(magicValue2)
       goto start;
  }
}
end : 

نصائح أخرى

وماذا عن هذا:

for(int i = 0; i < 1000; i++) {
    if(values[i] == MAGIC_VALUE_1) {
        break;
    } else if(values[i] == MAGIC_VALUE_2) {
        i = 0;
    }
}

وإذا كان عن طريق "انتقال إلى بداية" تقصد "تخطي هذا السجل ومعالجة واحدة المقبل" استبدال i = 0 مع continue.

وهناك تباين while مع عدم وجود break:

bool continue = true; int i = 0;
while (i < 1000 && continue){
    if(values[i] == MAGIC_VALUE_1) {
        continue=false;
    } else if(values[i] == MAGIC_VALUE_2) {
        i = 0;
    }
    i++;
}

لا أستطيع التعليق بعد (1 نقطة مندوب بعيدا)

ولكن لن يكون هذا أفضل:

for (int i = 0; i < 1000; i++)
{
    if (magicValue1)
    {
       break;
    }
    else if (magicValue2)
    {
       dosomething();
       i=0;
    }
}

ولست متأكدا من ماذا يكون المقصود ب "إعادة البحث".

وأنا أخذ رقم 2 لحالة يعني أنك تريد أن يتم تنفيذ (أي القفز) الجسم حلقة في حالة رقم 2 وليس الذي تريد إعادة تعيين حلقة إلى 0. (راجع التعليقات كود إذا أنا لقد حصلت على هذا الخلف).

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

        for (int i= 0; i<values.Length && values[i]!= MAGIC_1; i++)
        {
            if (values[i] == MAGIC_2)
            {
                // Don't do the loop body for this case but continue on looping
                continue;
                // If you want to reset the loop to zero instead of skip the 2 case,
                // comment-out the continue; and un-comment the line below:
                // i=0;
            }
            // Do long loop body here
        }

ولكن لاحظ أنه إذا قمت بتعيين العداد إلى 0 إذا MagicValue هو 2، والتعليمات البرمجية يتغير أبدا القيم، وربما كنت ستكون في حلقة لا نهائية.

وهناك أكثر تعقيدا يمكن أن يكون:

ونحن نعرف 2 طرق الإرشاد.

public static class Extensions
{
   public static bool isMagic_1(this int i)
   {
         return i == 1;
   }

   public static bool isMagic_2(this int i)
   {
         return i == 2;
   }
}

والآن يمكنك القيام بذلك:

  for(int i = 0; i < 1000; i++)
  {
     if(i.isMagic_1())
       break;
     if(i.isMagic_2())
       continue;
  }

وأمل أن يساعد هذا!

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