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
相关产品推荐
相关产品推荐

