使用linq将对象列表按父元素分组以输出子元素
本文关键字:元素 输出 linq 对象 列表 使用 | 更新日期: 2023-09-27 18:10:36
我在使用linq组时遇到了一个愚蠢的问题,我就是不能自己工作。
基本上,我有一个项目列表,我试图通过它的parentId显示细节将它们分组在一起
var list = new List<GroupItem>()
{
new GroupItem() {Id = 1, Name = ".net"},
new GroupItem() {Id = 2, Name = "asp.net", ParentId = 1},
new GroupItem(){Id = 3,Name = "c#",ParentId = 1},
new GroupItem(){Id = 4,Name = "php"},
new GroupItem(){Id = 5,Name = "zend",ParentId = 4}
};
var group = from g in list
group g by g.ParentId ==null
into grouped
select new
{
FrameworkId = grouped.Key,
Items = (from g in list
where g.ParentId==g.ParentId
select g).ToList()
};
foreach (var gi in group)
{
Console.WriteLine(gi.FrameworkId);
foreach (var item in gi.Items)
{
Console.WriteLine(item.Name);
}
}
我做错了什么?
您的查询似乎太复杂了:
- 您应该按
ParentId
分组的项目有它不是null - 您不需要通过匹配
ParentId
来重新查找项目,因为GroupBy
操作符为您完成了
我的首选解决方案:
list.Where(x => x.ParentId != null)
.GroupBy(x => x.ParentId,
(key, elements) =>
new {
FrameworkId = key,
Items = elements.ToList()
})
.ToList();
您可以直接使用此查询来过滤数据。
如果你想要没有ParentID的数据,那么你可以使用下面提到的查询
var gr = list.Where(p => p.ParentId == 0).ToList();
如果你想要有父Id的数据,那么你可以使用下面提到的代码
var gr1 = list.Where(p => p.ParentId != 0).ToList();
我的解决方案是:
list.Where(x => x.ParentId != null)
.GroupBy(x => x.ParentId)
.Select(x => new ParentViewModel {
ParentId = x.Key.ParentId,
Parent = x.ToList()
})
.ToList();
现在您将在ParentViewModel
的Parent对象中获得子项目,例如Parent.Items