2012-05-21 23 views
5

मेरी समस्या इस तरह है:डायनामिक फॉर-लूप स्तरों के लिए कोड कैसे करें?

मेरे पास कई सूचियों की अनुमति है, लेकिन सूची संख्या अज्ञात हैं। और प्रत्येक सूची में प्रत्येक तत्व संख्या भी अनजान हैं। Sicne मैं सभी सूची तत्व संयोजन को पार करना चाहता हूं, जैसे 1) सूची 1 से ए चुनें, सूची 2 से ए, सूची 3 से ए; 2) सूची 1 से ick ए, सूची 2 से ए, सूची 3 से बी ... सभी क्रमपरिवर्तन के लिए।

मैं नेस्टेड का उपयोग लूप के लिए पार करने के लिए, अगर मैं दो सूचियों, तो है की तरह:

 for (int i = 0; i < list[0].EnergyParameters.ListEnergyLevelCandidates.Count; i++) 
     { 
      for (int j = 0; j < list[1].EnergyParameters.ListEnergyLevelCandidates.Count; j++) 
      { 
       // Do sth 
      } 
     } 

अगर मैं तीन सूचियों है, तो:

 for (int i = 0; i < list[0].EnergyParameters.ListEnergyLevelCandidates.Count; i++) 
     { 
      for (int j = 0; j < list[1].EnergyParameters.ListEnergyLevelCandidates.Count; j++) 
      { 
       for (int k = 0; k < list[2].EnergyParameters.ListEnergyLevelCandidates.Count; k++) 
       { 
        // Do sth 
       } 
      } 
     } 

क्योंकि सूची संख्या अज्ञात हैं , इसलिए घोंसले की संख्या अज्ञात हैं, जिसका मतलब है, मुझे नहीं पता कि फॉर-लूप के कितने स्तर लिखे जाने की आवश्यकता है।

इस तरह की परिस्थिति में, मैं डायनामिक फॉर-लूप स्तरों के लिए कोड कैसे लिख सकता हूं? मैं 10 सूचियों के लिए 10 loops लिखना नहीं चाहता।

उत्तर

10

यदि आपको नहीं पता कि वहां कितनी सूचियां हैं, तो आप नेस्टेड लूप नहीं लिखते हैं: इसके बजाय, आप रिकर्सन लिखते हैं। मंगलाचरण आप पाश एक सूची के प्रत्येक स्तर, इस तरह में:

void AllCombos(List<string>[] lists, int level, string[] current) { 
    if (level == lists.Length) { 
     // Do somthing; items of current[] contain elements of the combination 
    } else { 
     foreach (var s in lists[level]) { 
      current[level] = s; 
      AllCombos(lists, level+1, current); 
     } 
    } 
} 

कॉल AllCombos के रूप में इस प्रकार है:

var lists = new List<string>[10]; 
for (int i = 0 ; i != 10 ; i++) { 
    lists[i] = PopulateMyList(i); 
} 
string[] current = new string[lists.Length]; 
AllCombos(lists, 0, current); 
+0

यह अभी भी बहु पाश exexute करता है? – Asker

+0

@Asker यह करता है। यद्यपि लूप प्रोग्राम के स्रोत में टेक्स्ट रूप से घोंसले नहीं होते हैं, लेकिन वे निष्पादन समय पर घोंसले होते हैं। देखें कि 'ऑलकंबोस' स्वयं कैसे कॉल करता है? यह वह जगह है जहां "जादू" होता है (हालांकि निश्चित रूप से इसके बारे में कुछ भी जादुई नहीं है)। – dasblinkenlight

+0

क्यों और 10 क्या है? क्या यह अधिकतम गहराई माना जाता है या क्या? –