2009-10-01 8 views
11

मेरे पास एक पुनरावर्ती विधि है जो मुझे श्रेणियां लौटाती है, और इसकी उप श्रेणियों की जांच करती है।रिकर्सिव कॉल एक सूची लौटाता है, रिटर्न प्रकार मुझे समस्याएं पैदा करता है

public List<Category> GetAllChildCats(int categoryid) 
{ 
     List<Category> list = new List>Category>(); 

     Category c = Get(categoryid); 

     foreach(Category cat in c.ChildCategories) 
     { 
       list.Add(GetAllChildCats(cat.CategoryID)) 

     } 

} 

यह विफल रहता है क्योंकि कॉल list.add करने के लिए एक श्रेणी वस्तु की उम्मीद है, लेकिन यह अभी तक एक और सूची वापसी है, मैं कैसे इस के आसपास काम करना चाहिए:

तो यह की तरह लग रहा है?

उत्तर

36

वर्तमान में आप कुछ भी नहीं दिखाया जो वास्तव में सूची में एक भी श्रेणी जोड़ता है ... मैं के रूप में आप recurse कि यह सोचते कर रहा हूँ , आप Get(categoryId) के साथ-साथ

प्रीसेट का समाधान निश्चित रूप से काम करेगा, लेकिन यहां एक विकल्प है जो सभी अतिरिक्त सूचियों को बनाने से बचाता है:

public List<Category> GetAllChildCats(int categoryId) 
{ 
    List<Category> ret = new List<Category>(); 
    GetAllChildCats(categoryId, ret); 
    return ret; 
} 

private void GetAllChildCats(int categoryId, List<Category> list) 
{ 
    Category c = Get(categoryid); 
    list.Add(c); 

    foreach(Category cat in c.ChildCategories) 
    { 
     GetAllChildCats(cat.CategoryID, list); 
    } 
} 

यह एक एकल सूची बनाता है, और इसके रूप में आइटम जोड़ता है।

एक बिंदु हालांकि - अगर आपको पहले से ही Category ऑब्जेक्ट्स मिल गया है, तो क्या आपको वास्तव में Get पर कॉल करने की आवश्यकता है? क्या प्रत्येक बच्चे में केवल तब तक आईडी होती है जब तक कि आप पूरी श्रेणी नहीं ले लेते?

12
foreach(Category cat in c.ChildCategories) 
     { 
       list.AddRange(GetAllChildCats(cat.CategoryID)) 

     } 

और भूल नहीं है

return list; 
+2

वर्तमान में है कि हमेशा एक खाली सूची लौटने खत्म हो जाएगा ... अधिक जानकारी के लिए मेरा उत्तर देखें: यहाँ जिस तरह से मैं इसे हल है। –

2

मुझे लगता है कि इस LINQ संस्करण आप सूची बनाने के स्थान भूमि के ऊपर से बचने के लिए अनुमति देगा:

public IEnumerable<Category> GetAllChildCats(int categoryid) 
{ 
    Category c = Get(categoryid); 
    return new[] { c }.Concat(c.ChildCategories.SelectMany(cat => GetAllChildCats(cat))); 
} 

तुम हमेशा वापस आ IEnumerable पर ToList() कॉल कर सकते हैं यदि आप इसे की जरूरत है।

+1

आप उत्सुक हैं। पुनरावृत्ति के लिए चयन करें नरक के रूप में धीमा है। – Elisabeth

2

मुझे पहले भी यही समस्या थी।

public void GetAllChildCategories(ProductCategory ParentCategory) 
{ 
    ParentCategory.ChildCategories = GetChildCategories(ParentCategory.ID); 

    foreach(ProductCategory cat in ParentCategory.ChildCategories) 
    { 
     GetAllChildCategories(cat); 
    } 
} 
संबंधित मुद्दे