如何用LINQ简化嵌套循环实现按用户统计有效请假天数
用LINQ简化你的请假天数统计代码
我帮你把这段嵌套循环重构为更简洁易读的LINQ写法,先明确你的核心逻辑:统计每个用户满足status == "1"且leave_type != "3"的请假天数,区分半天假(check_halfday == 1算0.5天)和全天假,最终更新或新增到attendancelist集合中。
重构后的代码
// 1. 提取所有符合条件的请假记录,扁平化嵌套列表 var validLeaves = leavesresult .SelectMany(dateGroup => dateGroup.LeaveList) .Where(leave => leave.status == "1" && leave.leave_type != "3"); // 2. 按用户ID分组,计算每个用户的总请假天数 var userTotalLeaveDays = validLeaves .GroupBy(leave => leave.user_id) .Select(group => new { UserId = group.Key, TotalDays = group.Sum(leave => leave.check_halfday == 1 ? 0.5 : 1.0) }); // 3. 更新或新增到attendancelist集合 foreach (var userLeave in userTotalLeaveDays) { var existingAttendance = attendancelist.FirstOrDefault(a => a.user_id == userLeave.UserId); if (existingAttendance != null) { existingAttendance.days += userLeave.TotalDays; } else { attendancelist.Add(new AttendanceModel { user_id = userLeave.UserId, days = userLeave.TotalDays }); } }
代码逻辑拆解
SelectMany:把嵌套的LeaveList扁平化成一维列表,直接跳过原代码的第一层循环,一次性处理所有请假记录。Where:集中筛选符合status和leave_type条件的记录,替代原代码里分散的条件判断。GroupBy+Sum:按用户ID自动分组后,直接计算每个用户的总请假天数,把原代码里手动判断半天/全天、累加天数的逻辑合并成一行,简洁高效。- 最后一步的foreach:因为需要修改原
attendancelist集合(更新已有记录或新增),用foreach处理更直观,也符合LINQ侧重查询而非修改集合的设计原则。
和原代码的对比
重构后的代码把复杂的嵌套逻辑拆成了清晰的三步,去掉了两层嵌套循环,可读性和维护性大幅提升——你能一眼看懂每一步的目标,不用在嵌套分支里反复梳理逻辑。
内容的提问来源于stack exchange,提问作者Chitra Nandpal
相关产品推荐
相关产品推荐

