2010-05-27 73 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