حلقة C# - الاستراحة مقابل الاستراحةيكمل
-
08-06-2019 - |
سؤال
في حلقة C# (لا تتردد في الإجابة على اللغات الأخرى)، ما الفرق بين الاستراحة والمتابعة كوسيلة لترك بنية الحلقة، والانتقال إلى التكرار التالي؟
مثال:
foreach (DataRow row in myTable.Rows)
{
if (someConditionEvalsToTrue)
{
break; //what's the difference between this and continue ?
//continue;
}
}
المحلول
break
سوف يخرج من الحلقة تماما continue
سوف فقط يتخطى التكرار الحالي.
على سبيل المثال:
for (int i = 0; i < 10; i++) {
if (i == 0) {
break;
}
DoSomeThingWith(i);
}
سيؤدي الفاصل إلى خروج الحلقة عند التكرار الأول - DoSomeThingWith
لن يتم إعدامه أبدًا.هذه هنا:
for (int i = 0; i < 10; i++) {
if(i == 0) {
continue;
}
DoSomeThingWith(i);
}
لن ينفذ DoSomeThingWith
ل i = 0
, ، ولكن الحلقة سوف يكمل و DoSomeThingWith
سيتم تنفيذه ل i = 1
ل i = 9
.
نصائح أخرى
إحدى الطرق السهلة حقًا لفهم ذلك هي وضع كلمة "حلقة" بعد كل كلمة من الكلمات الرئيسية.تصبح المصطلحات الآن منطقية إذا تمت قراءتها مثل العبارات اليومية.
break
حلقة - التكرار مكسور ويتوقف.
continue
حلقة - تستمر الحلقة في التنفيذ مع التكرار التالي.
استراحة يتسبب في خروج عداد البرنامج من نطاق الحلقة الأعمق
for(i = 0; i < 10; i++)
{
if(i == 2)
break;
}
يعمل مثل هذا
for(i = 0; i < 10; i++)
{
if(i == 2)
goto BREAK;
}
BREAK:;
يكمل يقفز إلى نهاية الحلقة.في حلقة for، استمر بالانتقال إلى تعبير الزيادة.
for(i = 0; i < 10; i++)
{
if(i == 2)
continue;
printf("%d", i);
}
يعمل مثل هذا
for(i = 0; i < 10; i++)
{
if(i == 2)
goto CONTINUE;
printf("%d", i);
CONTINUE:;
}
break
سوف يتوقف foreach
حلقة كاملة، continue
سوف انتقل إلى التالي DataRow
.
هناك أكثر من عدد قليل من الناس الذين لا يحبون break
و continue
.آخر شكوى رأيتها بشأنهم كانت في جافا سكريبت:الأجزاء الجيدة بواسطة دوجلاس كروكفورد.ولكنني أجد أن استخدام أحدها في بعض الأحيان يؤدي إلى تبسيط الأمور حقًا، خاصة إذا كانت لغتك لا تتضمن حرف do-while
أو do-until
نمط الحلقة.
أنا أميل إلى استخدام break
في الحلقات التي تبحث في قائمة عن شيء ما.بمجرد العثور عليه، ليس هناك فائدة من الاستمرار، لذا من الأفضل أن تستقيل.
أنا أستعمل continue
عند القيام بشيء ما بمعظم عناصر القائمة، ولكنك لا تزال ترغب في تخطي القليل منها.
ال break
تكون العبارة مفيدة أيضًا عند الاقتراع للحصول على استجابة صالحة من شخص ما أو شيء ما.بدلاً من:
Ask a question
While the answer is invalid:
Ask the question
يمكنك التخلص من بعض الازدواجية والاستخدام:
While True:
Ask a question
If the answer is valid:
break
ال do-until
الحلقة التي ذكرتها من قبل هي الحل الأكثر أناقة لهذه المشكلة بالذات:
Do:
Ask a question
Until the answer is valid
لا الازدواجية، ولا break
حاجة سواء.
لقد أعطى الجميع تفسيرا جيدا للغاية.ما زلت أنشر إجابتي فقط لإعطاء مثال إذا كان ذلك يمكن أن يساعد.
// break statement
for (int i = 0; i < 5; i++) {
if (i == 3) {
break; // It will force to come out from the loop
}
lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}
هنا هو الإخراج:
0 [مطبوع] 1 [مطبوع] 2 [مطبوع]
لذلك لن يتم عرض 3[مطبوع] و4[مطبوع] نظرًا لوجود فاصل عندما يكون i == 3
//continue statement
for (int i = 0; i < 5; i++) {
if (i == 3) {
continue; // It will take the control to start point of loop
}
lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}
هنا هو الإخراج:
0 [مطبوع] 1 [مطبوع] 2 [مطبوع] 4 [مطبوع]
لذلك لن يتم عرض 3[Printed] نظرًا لوجود متابعة عندما == 3
استراحة
يفرض الكسر على الحلقة الخروج فورًا.
يكمل
وهذا يفعل عكس الكسر.بدلاً من إنهاء الحلقة، فإنها تتكرر مرة أخرى على الفور، متخطية بقية التعليمات البرمجية.
على سبيل المثال
foreach(var i in Enumerable.Range(1,3))
{
Console.WriteLine(i);
}
يطبع 1، 2، 3 (على أسطر منفصلة).
أضف شرط الاستراحة عند i = 2
foreach(var i in Enumerable.Range(1,3))
{
if (i == 2)
break;
Console.WriteLine(i);
}
الآن تطبع الحلقة 1 وتتوقف.
استبدل الفاصل بالمتابعة.
foreach(var i in Enumerable.Range(1,3))
{
if (i == 2)
continue;
Console.WriteLine(i);
}
الآن قم بتكرار المطبوعات 1 و 3 (تخطي 2).
هكذا، break
يوقف الحلقة، في حين continue
يتخطى إلى التكرار التالي.
روبي للأسف مختلفة بعض الشيء.ملاحظة:ذاكرتي ضبابية بعض الشيء في هذا الشأن، لذا أعتذر إذا كنت مخطئًا
بدلاً من الفاصل/المتابعة، يحتوي على الفاصل/التالي، والذي يتصرف بنفس الطريقة فيما يتعلق بالحلقات
الحلقات (مثل أي شيء آخر) هي تعبيرات، و"ترجع" آخر شيء فعلته.في معظم الأحيان، يكون الحصول على القيمة المرجعة من الحلقة أمرًا لا معنى له، لذلك يقوم الجميع بذلك
a = 5
while a < 10
a + 1
end
ومع ذلك يمكنك القيام بذلك
a = 5
b = while a < 10
a + 1
end # b is now 10
ومع ذلك، فإن الكثير من أكواد روبي "تحاكي" حلقة باستخدام كتلة.المثال الكنسي هو
10.times do |x|
puts x
end
نظرًا لأنه من الشائع جدًا أن يرغب الأشخاص في القيام بأشياء نتيجة كتلة، فهذا هو المكان الذي تصبح فيه الأمور فوضوية.الفاصل/التالي يعني أشياء مختلفة في سياق الكتلة.
Break سوف يقفز من الكود الذي يسمى الكتلة
بعد ذلك، سيتم تخطي بقية الكود الموجود في الكتلة، و"إرجاع" ما تحدده إلى المتصل في الكتلة.وهذا لا معنى له دون أمثلة.
def timesten
10.times{ |t| puts yield t }
end
timesten do |x|
x * 2
end
# will print
2
4
6
8 ... and so on
timesten do |x|
break
x * 2
end
# won't print anything. The break jumps out of the timesten function entirely, and the call to `puts` inside it gets skipped
timesten do |x|
break 5
x * 2
end
# This is the same as above. it's "returning" 5, but nobody is catching it. If you did a = timesten... then a would get assigned to 5
timesten do |x|
next 5
x * 2
end
# this would print
5
5
5 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.
إذن أجل.روبي رائعة، ولكن لديها بعض الحالات الزاوية الفظيعة.هذا هو ثاني أسوأ شيء رأيته خلال سنوات استخدامه :-)
إجابة بسيطة:
استراحة يخرج من الحلقة على الفور.
يكمل يبدأ معالجة العنصر التالي.(إذا كان هناك أي منها، بالانتقال إلى سطر التقييم الخاص بـ for/while)
أرجو أن أذكر ما هو واضح:لاحظ أن إضافة لا فاصل ولا متابعة، سوف يستأنف برنامجك؛أي.لقد حوصرت بسبب خطأ معين، ثم بعد تسجيله، أردت استئناف المعالجة، وكان هناك المزيد من مهام التعليمات البرمجية بين الصف التالي، لذلك سمحت لها بالفشل.
للخروج تمامًا من حلقة foreach، استراحة يستخدم؛
للانتقال إلى التكرار التالي في الحلقة، يكمل يستخدم؛
استراحة يكون مفيدًا إذا كنت تقوم بالتكرار عبر مجموعة من الكائنات (مثل الصفوف في Datatable) وكنت تبحث عن تطابق معين، وعندما تجد هذا التطابق، ليست هناك حاجة للمتابعة خلال الصفوف المتبقية، لذلك تريد الخروج .
يكمل يكون مفيدًا عندما تنجز ما تحتاج إليه داخل تكرار الحلقة.سيكون لديك عادة يكمل بعد لو.
إذا كنت لا تريد استخدامها استراحة كل ما عليك فعله هو زيادة قيمة I بطريقة تجعل شرط التكرار خاطئًا ولن يتم تنفيذ الحلقة في التكرار التالي.
for(int i = 0; i < list.Count; i++){
if(i == 5)
i = list.Count; //it will make "i<list.Count" false and loop will exit
}
أما بالنسبة للغات الأخرى:
'VB
For i=0 To 10
If i=5 then Exit For '= break in C#;
'Do Something for i<5
next
For i=0 To 10
If i=5 then Continue For '= continue in C#
'Do Something for i<>5...
Next