我有以下列表,其中包含以下集合。
我如何用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 :(得分: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
答案 1 :(得分: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);
}
}