2009-10-01 40 views
11

Tôi có phương thức đệ quy để trả về các danh mục và kiểm tra các danh mục con của nó.Trả về cuộc gọi đệ quy Danh sách, kiểu trả về gây ra cho tôi các vấn đề

Vì vậy, nó trông giống như:

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)) 

     } 

} 

này sai vì các cuộc gọi đến list.add hy vọng một đối tượng loại, nhưng nó là trở lại thêm một List, làm thế nào tôi nên làm việc xung quanh này?

Trả lời

36

bất cứ điều gì Hiện nay bạn đã không được hiển thị mà thực sự bổ sung thêm một loại duy nhất để danh sách ... Tôi giả định rằng khi bạn recurse , bạn cũng muốn thêm kết quả của Get(categoryId) ·

Giải pháp của trước sẽ chắc chắn hoạt động, nhưng đây là giải pháp thay thế tránh tạo ra tất cả danh sách bổ sung:

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); 
    } 
} 

Điều này tạo một danh sách và thêm các mục vào danh sách khi nó đi.

Một điểm mặc dù - nếu bạn đã có con Category đối tượng, bạn có thực sự cần gọi lại số Get không? Mỗi đứa trẻ chỉ chứa ID của nó cho đến khi bạn lấy toàn bộ danh mục không?

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

     } 

và đừng quên các

return list; 
+2

Hiện tại sẽ luôn trả về danh sách trống ... xem câu trả lời của tôi để biết thêm chi tiết. –

2

Tôi nghĩ rằng phiên bản LINQ này sẽ cho phép bạn để tránh việc tạo ra một danh sách:

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

Bạn luôn có thể gọi ToList() trên IEnumerable trả lại nếu bạn cần nó.

+1

Bạn đang quan tâm. .SelectMany cho đệ quy chậm như địa ngục. – Elisabeth

2

Tôi đã gặp vấn đề tương tự trước đây. Đây là cách tôi đã giải quyết:

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

    foreach(ProductCategory cat in ParentCategory.ChildCategories) 
    { 
     GetAllChildCategories(cat); 
    } 
} 
Các vấn đề liên quan