You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用LINQ实现组用户列表自展开?嵌套组转纯用户需求

解决组递归展开并合并用户的问题

你的问题核心是处理嵌套组的递归展开——原代码只处理了一层子组,没法应对更深层级的嵌套(比如组A包含组B,组B又包含组C),而且嵌套循环查找组的效率也不高。这里给你一个更简洁高效的实现方式:

步骤1:先构建组的查找字典

先把所有组放到一个字典里,这样可以通过组名快速定位到组对象,避免每次遍历整个列表:

// 构建组名到组对象的映射,提升查找效率
var groupLookup = Usergroup.ToDictionary(g => g.Name);

步骤2:写一个递归方法获取所有用户

这个方法会递归遍历当前组的所有子组,收集所有用户并去重:

// 递归获取某个组下的所有用户(包括所有嵌套子组的用户)
private IEnumerable<UserMapping> GetAllUsersForGroup(string groupName, Dictionary<string, GroupUserClassMapping> groupLookup)
{
    if (!groupLookup.TryGetValue(groupName, out var group))
    {
        return Enumerable.Empty<UserMapping>();
    }

    // 先收集当前组的用户
    var allUsers = new List<UserMapping>(group.Users ?? Enumerable.Empty<UserMapping>());

    // 递归遍历每个子组,收集子组的用户
    if (group.groups != null)
    {
        foreach (var subGroup in group.groups)
        {
            allUsers.AddRange(GetAllUsersForGroup(subGroup.Name, groupLookup));
        }
    }

    // 去重(按用户名)
    return allUsers.GroupBy(u => u.Name).Select(g => g.First());
}

步骤3:遍历所有组,展开并替换用户

最后遍历每个组,调用上面的方法获取所有用户,同时清空子组列表(达到“无子组”的目标):

foreach (var group in Usergroup)
{
    // 获取当前组所有嵌套子组的用户
    group.Users = GetAllUsersForGroup(group.Name, groupLookup).ToArray();
    // 清空子组,确保最终列表只有用户
    group.groups = null;
}

为什么这个方案更好?

  • 递归处理任意层级:不管组嵌套多少层(比如组→子组→孙组→...),都能完全展开,解决了原代码只能处理一层的问题。
  • 更高的效率:用字典查找组是O(1)操作,避免了原代码三层嵌套循环的O(n³)复杂度。
  • 代码更简洁:把展开逻辑封装到单独方法里,可读性和可维护性更强。

补充说明

如果你的GroupsMapping类和GroupUserClassMapping不是同一个类型,只需要调整递归方法里的子组名称获取逻辑即可(确保能拿到子组的名称去字典里查找)。

内容的提问来源于stack exchange,提问作者TheDentist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:06:42