2010-05-27 35 views
0

我有以下列表,其中包含以下集合。使用linq創建分類列表

我可以如何轉換這與linq,這樣我得到嵌套的項目。

var categories = new List<Category>(); // id, parentId, name 
     categories.Add(1, 0, "Sport"); 
     categories.Add(2, 0, "Pets"); 
     categories.Add(3, 1, "Foot ball"); 
     categories.Add(4, 2, "Cat"); 
     categories.Add(5, 3, "Pele"); 
     categories.Add(6, 4, "whiskers"); 
     // ie Pets - > Cat - > Whiskers 





    public class Category 
    { 

     public int Id { get; set; } 
     public int ParentId { get; set; } 
     public ICollection<Category> Categories { get; set; } 

    } 
+0

您的問題。這個不成立。虛擬屬性也很奇怪。 – Will 2010-05-27 15:25:06

+0

ParentID的ID不應該不同嗎?例如貓和威威是身份證1,「足球」和貝利是2,你可以將他們分組? – MrEdmundo 2010-05-27 15:27:30

+0

你想要輸出什麼?什麼是你的類的構造函數? (就像我看到的那樣,Add方法調用將失敗......) – 2010-05-27 15:31:56

回答

1

事情是這樣的:

 var nested = categories.GroupBy(c => c.ParentId) 
           .Select(cat => new Category 
           { 
            ParentId = cat.Key, 
            Categories = cat.Select(x => new Category 
                    { 
                     Id = x.Id 
                    }).ToList() 
           }); 

我做了類似的作品和但是有兩個層面的東西,如果你需要更多的東西通用的,多層次,我不知道,如果你可以做到這一點至少LINQ。

HTH

0

這是一種方法。 (編輯,糾正孤兒,並返回所有根)

List<Category> results = new List<Category>(); 
Dictionary quickCategories = categories.ToDictionary(c => c.ID); 

foreach(var g in categories.GroupBy(c => c.ParentID)) 
{ 
    if quickCategories.ContainsKey(g.Key) 
    { 
    quickCategories[g.Key].Categories = g.ToList(); 
    } 
    else 
    { 
    results.AddRange(g); 
    } 
} 
+0

嘿謝謝,我試過第一個,但它似乎ParentId不是字典。我也嘗試過第二次,但是如何從這個值返回一個值? – frosty 2010-05-27 19:59:34

+0

你必須有孤兒。 – 2010-05-27 20:30:59