注意原始数据不要是IEnumable,否则你会发现Children是空的

方法1

//前提,包含父级关联字段,比如ParentId和Id


//原始数组
var list = new List<dynamic>();
//顶层数组
var rootMenus = new List<SysMenuDto>();

foreach (var item in list)
{
    var parent = list.FirstOrDefault(x => x.Id == item.ParentId);
    if (parent.IsNull())
    {
        rootMenus.Add(item);
        continue;
    }
    parent!.Children.Add(item);
}

return rootMenus;

方法2

var list = menus.Select(x =>
{
    var item = x.Adapt<SysMenuDto>();
    item.Meta = x.Adapt<SysMenuMetaDto>();
    return item;
}).ToList();

var menuDictionary = list.ToDictionary(menu => menu.Id);
var rootMenus = new List<SysMenuDto>();

foreach (var menu in list)
{
    if (menu.ParentId == 0)
    {
        rootMenus.Add(menu);
    }
    else if (menuDictionary.TryGetValue(menu.ParentId, out SysMenuDto parentMenu))
    {
        parentMenu.Children.Add(menu);
    }
}

return rootMenus;
最后修改:2024 年 07 月 03 日
如果觉得我的文章对你有用,请随意赞赏