基于权限与部门规则从用户列表中查询用户直属经理的实现方法
直属经理查询实现方案
第一步:数据预处理
首先需要把原始按部门拆分的用户记录,按user_id聚合得到每个用户的完整属性:
- 所属全部部门集合
- 全部权限集合(同一用户的多条记录权限完全一致,取任意一条即可)
第二步:核心查询逻辑
按顺序执行以下筛选和排序即可得到结果:
- 提取目标用户的聚合信息:所属部门集合
targetDepts、权限集合targetPerms、部门数量targetDeptCount、权限数量targetPermCount - 筛选符合条件的候选经理:
- 候选的所属部门与
targetDepts存在交集(满足同部门要求) - 候选的权限集合是
targetPerms的超集(拥有目标用户的全部权限) - 候选的权限数量 >
targetPermCount或 候选的部门数量 >targetDeptCount - 候选的
user_id不等于目标用户的user_id
- 候选的所属部门与
- 对候选按「权限差 + 部门差」升序排序(差值越小代表和目标用户的条件越接近),取排序后的第一个就是直属经理,没有候选则返回无符合条件的结果
第三步:C# 实现代码
using System; using System.Collections.Generic; using System.Linq; class Program { // 聚合后的用户信息类 public class UserAggregate { public int UserId { get; set; } public HashSet<int> Departments { get; set; } public HashSet<string> Permissions { get; set; } public int DeptCount => Departments.Count; public int PermCount => Permissions.Count; } static void Main() { // 原始用户数据 var users = new[] { new { id = 5, user_id = 3, permissions = new [] { "apple", "Pineapple", "Strawberry", "Gooseberry", "Custard", }, department_id = 10, }, new { id = 6, user_id = 3, permissions = new [] { "apple", "Pineapple", "Strawberry", "Gooseberry", "Custard", }, department_id = 11, }, new { id = 7, user_id = 3, permissions = new [] { "apple", "Pineapple", "Strawberry", "Gooseberry", "Custard", }, department_id = 12, }, new { id = 8, user_id = 5, permissions = new [] { "apple", "Pineapple", "Strawberry", "Gooseberry", "Custard", }, department_id = 10, }, new { id = 9, user_id = 6, permissions = new [] { "apple", "Pineapple", "Strawberry", "Gooseberry", "Custard", }, department_id = 11, }, new { id = 10, user_id = 7, permissions = new [] { "apple", "Pineapple", "Strawberry", "Gooseberry", }, department_id = 12, }, new { id = 11, user_id = 8, permissions = new [] { "apple", "Pineapple", "Strawberry", }, department_id = 10, }, new { id = 12, user_id = 9, permissions = new [] { "apple", "Pineapple", }, department_id = 11, }, new { id = 13, user_id = 10, permissions = new [] { "Gooseberry", "Custard", }, department_id = 12, }, new { id = 20, user_id = 11, permissions = new [] { "Raspberry", }, department_id = 15, }, }; // 预处理聚合用户信息 var userAggregates = users .GroupBy(u => u.user_id) .Select(g => new UserAggregate { UserId = g.Key, Departments = g.Select(u => u.department_id).ToHashSet(), Permissions = g.First().permissions.ToHashSet() }) .ToList(); // 测试查询方法 Console.WriteLine(GetDirectManager(8, userAggregates)); // 输出5 Console.WriteLine(GetDirectManager(5, userAggregates)); // 输出3 Console.WriteLine(GetDirectManager(11, userAggregates)); // 输出0(代表无) Console.WriteLine(GetDirectManager(10, userAggregates)); // 输出3 } /// <summary> /// 查询直属经理 /// </summary> /// <param name="targetUserId">目标用户ID</param> /// <param name="userAggregates">聚合后的用户列表</param> /// <returns>直属经理用户ID,返回0代表无符合条件的经理</returns> static int GetDirectManager(int targetUserId, List<UserAggregate> userAggregates) { var target = userAggregates.FirstOrDefault(u => u.UserId == targetUserId); if (target == null) return 0; var candidates = userAggregates // 排除自己 .Where(u => u.UserId != targetUserId) // 同部门交集 .Where(u => u.Departments.Intersect(target.Departments).Any()) // 权限是超集 .Where(u => target.Permissions.All(p => u.Permissions.Contains(p))) // 满足权限更多或部门更多 .Where(u => u.PermCount > target.PermCount || u.DeptCount > target.DeptCount) // 按差异值升序排序,差异=权限差+部门差 .OrderBy(u => (u.PermCount - target.PermCount) + (u.DeptCount - target.DeptCount)) .ToList(); return candidates.Any() ? candidates.First().UserId : 0; } }
结果验证
运行代码测试用例完全匹配给出的参考示例:
user_id=8返回5,符合预期user_id=5返回3,符合预期user_id=11返回0(无符合条件经理),符合预期user_id=10返回3,符合预期
内容的提问来源于stack exchange,提问作者user666
相关产品推荐
相关产品推荐

