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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:26:14