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

LINQ实现:按嵌套Manager分组用户并按指定RoleId排序的正确方式

实现指定需求的LINQ解决方案

数据结构定义

class User
{
   public string Id { get; set; }
   public List<ManagerGroup> ManagerGroups { get; set; } 
}

class ManagerGroup
{
   public string RoleId { get; set; }
   public Manager[] Managers { get; set; }
}

class Manager
{
   public string Id { get; set; }
}

核心需求

从List<User>生成Dictionary<string, User[]>:

  • 键:唯一的Manager.Id
  • 值:关联该经理的所有用户组成的数组
  • 支持按指定ManagerGroup.RoleId对用户数组排序

单RoleId优先级排序实现

如果需要让关联指定RoleId分组的用户排在数组前面,代码如下:

// 替换为你需要指定的目标RoleId
string targetRoleId = "TargetRole";

Dictionary<string, User[]> managerUserMap = users
    // 展开所有用户-经理-RoleId的关联关系
    .SelectMany(user => user.ManagerGroups
        .SelectMany(group => group.Managers
            .Select(manager => new { User = user, ManagerId = manager.Id, RoleId = group.RoleId })))
    // 按经理ID分组
    .GroupBy(item => item.ManagerId)
    // 转换为字典并排序用户数组
    .ToDictionary(
        group => group.Key,
        group => group
            .Select(item => item.User)
            .Distinct() // 去重:避免同一用户因多组关联同一经理重复出现
            // 优先排列属于目标RoleId分组的用户,再按用户ID稳定排序
            .OrderByDescending(user => user.ManagerGroups.Any(g => 
                g.RoleId == targetRoleId && g.Managers.Any(m => m.Id == group.Key)))
            .ThenBy(user => user.Id)
            .ToArray()
    );

多RoleId优先级排序实现

如果需要按一组RoleId的优先级顺序排序(比如先排Role1,再Role2,最后其他),可以调整排序逻辑:

// 定义RoleId的优先级顺序,越靠前优先级越高
List<string> rolePriorityList = new List<string> { "Role1", "Role2", "Role3" };

Dictionary<string, User[]> managerUserMap = users
    .SelectMany(user => user.ManagerGroups
        .SelectMany(group => group.Managers
            .Select(manager => new { User = user, ManagerId = manager.Id, RoleId = group.RoleId })))
    .GroupBy(item => item.ManagerId)
    .ToDictionary(
        group => group.Key,
        group => group
            .Select(item => item.User)
            .Distinct()
            .OrderBy(user => {
                // 获取当前用户关联该经理的所有RoleId在优先级列表中的索引
                var matchedRoleIndexes = user.ManagerGroups
                    .Where(g => g.Managers.Any(m => m.Id == group.Key))
                    .Select(g => rolePriorityList.IndexOf(g.RoleId))
                    .Where(idx => idx != -1);
                // 取优先级最高的索引(数值越小优先级越高),无匹配则放到最后
                return matchedRoleIndexes.Any() ? matchedRoleIndexes.Min() : rolePriorityList.Count;
            })
            .ThenBy(user => user.Id)
            .ToArray()
    );

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:58:21