.net 使用linq创建类别列表

.net 使用linq创建类别列表,.net,linq,.net,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,

我有以下列表,其中包含以下集合

我如何使用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; }

    }
var categories=new List();//id,parentId,name
增加(1,0,“运动”);
类别。添加(2,0,“宠物”);
增加(3,1,“足球”);
增加(4,2,“类别”);
增加(5,3,“贝利”);
类别。添加(6、4,“胡须”);
//ie宠物->猫->胡须
公共类类别
{
公共int Id{get;set;}
public int ParentId{get;set;}
公共ICollection类别{get;set;}
}
类似这样的内容:

        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

这里有一种方法。 (编辑、更正孤立项并返回所有根)

列表结果=新列表();
Dictionary quickCategories=categories.ToDictionary(c=>c.ID);
foreach(categories.GroupBy中的var g(c=>c.ParentID))
{
如果quickCategories.ContainsKey(g.Key)
{
quickCategories[g.Key].Categories=g.ToList();
}
其他的
{
结果:AddRange(g);
}
}

你的问题。这毫无意义。虚拟属性也很奇怪。ParentID的id不应该不同吗?e、 g.猫和胡须的ID为1,“足球”和贝利的ID为2,这样您就可以对它们进行分组了?您希望输出什么?类别的构造函数是什么?(在我看来,
Add
方法调用将失败…)为什么需要转换它?当您需要提取结果时,只需查询相关ID即可;我修正了我的例子。现在应该有意义了。我已经删除了virtual(来自Nhibernate,但本例不需要)嘿,谢谢,我尝试了第一个,但ParentId似乎不是字典。我也尝试了第二种方法,但是如何从中返回值呢?
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);
  }
}