अद्यतन: यह प्रश्न my article on this subject. के लिए प्रेरणा थी महान प्रश्न के लिए धन्यवाद!
"जारी रखें" और "ब्रेक" "गोटो" के लिए सुखद वाक्यविन्यास से अधिक कुछ नहीं है। स्पष्ट रूप से उन्हें सुंदर नाम देकर और विशेष नियंत्रण संरचनाओं के लिए अपने उपयोग को सीमित करके, वे अब "सभी गेटो सभी समय खराब" भीड़ की चिल्ला नहीं खींचते हैं।
यदि आप क्या करना चाहते हैं एक जारी रखने के लिए करने के लिए बाहरी, आप बस एक लेबल बाहरी पाश के शीर्ष पर "गोटो" है कि लेबल को परिभाषित करने और फिर सकता है। अगर आपको लगा कि ऐसा करने से कोड की समझ में बाधा नहीं आती है, तो यह सबसे अधिक सुविधाजनक समाधान हो सकता है।
हालांकि, मैं इसे इस बात पर विचार करने का अवसर दूंगा कि आपका नियंत्रण प्रवाह कुछ रिफैक्टरिंग से लाभान्वित होगा या नहीं। जब भी मेरे पास नेस्टेड लूप में सशर्त "ब्रेक" और "जारी" होता है, तो मैं रिफैक्टरिंग पर विचार करता हूं।
पर विचार करें:
successfulCandidate = null;
foreach(var candidate in candidates)
{
foreach(var criterion in criteria)
{
if (!candidate.Meets(criterion)) // Edited.
{ // TODO: no point in continuing checking criteria.
// TODO: Somehow "continue" outer loop to check next candidate
}
}
successfulCandidate = candidate;
break;
}
if (successfulCandidate != null) // do something
दो रिफैक्टरिंग तकनीक:
सबसे पहले, एक विधि के लिए भीतरी पाश निकालें:
foreach(var candidate in candidates)
{
if (MeetsCriteria(candidate, criteria))
{
successfulCandidate = candidate;
break;
}
}
दूसरा, सभी छोरों समाप्त किया जा सकता? यदि आप लूपिंग कर रहे हैं क्योंकि आप कुछ खोज करने की कोशिश कर रहे हैं, तो इसे एक क्वेरी में दोबारा दोहराएं।
var results = from candidate in candidates
where criteria.All(criterion=>candidate.Meets(criterion))
select candidate;
var successfulCandidate = results.FirstOrDefault();
if (successfulCandidate != null)
{
do something with the candidate
}
यदि कोई लूप नहीं है तो तोड़ने या जारी रखने की कोई आवश्यकता नहीं है!
स्रोत
2009-07-15 19:40:02
नेस्टेड लूप केवल निराशा का कारण बनते हैं। –