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

如何修正LINQ GroupBy语句实现工作天数多阈值人数统计

员工考勤LINQ统计逻辑修复

基础数据说明

现有考勤记录集合items存储员工出勤数据,包含2个字段:

  • name:员工姓名
  • date:对应工作日期

原始考勤明细:

  • 员工a:出勤日期为2022-3-5、2022-3-6、2022-3-7
  • 员工b:出勤日期为2022-3-6、2022-3-7
  • 员工c:出勤日期为2022-3-7

统计需求

需生成两类统计报表:

  1. 人员出勤明细表:统计每位员工的累计工作天数,预期结果为a工作3天、b工作2天、c工作1天
  2. 汇总统计报表:依次统计5项指标,预期结果为:出勤≥3天人数1、出勤≥2天人数2、出勤≥1天人数3、总人数3、总工作天数3

原有代码问题

原有代码错误使用date作为分组键,实际统计的是「满足出勤人数阈值的日期数量」,和需求要求的「按员工维度统计出勤天数后,计算满足阈值的员工数量」逻辑完全不符,错误代码如下:

int count1 = items.GroupBy(g => g.date).Where(w => w.Count() >= 3).Count();
int count2 = items.GroupBy(g => g.date).Where(w => w.Count() >= 2).Count();
int count3 = items.GroupBy(g => g.date).Where(w => w.Count() >= 1).Count();

修复后实现

核心修正点:将分组键从date改为员工唯一标识name,先完成单员工出勤天数的基础统计,再基于该中间结果生成两类报表,避免重复计算。

// 第一步:按员工分组,计算单员工累计出勤天数,作为所有统计的基础数据源
var userAttendance = items
    .GroupBy(g => g.name)
    .Select(g => new {
        UserName = g.Key,
        WorkDays = g.Count()
    })
    .ToList();

// 汇总统计报表指标计算
int count1 = userAttendance.Count(x => x.WorkDays >= 3); // 出勤≥3天人数,结果1
int count2 = userAttendance.Count(x => x.WorkDays >= 2); // 出勤≥2天人数,结果2
int count3 = userAttendance.Count(x => x.WorkDays >= 1); // 出勤≥1天人数,结果3
int totalUser = userAttendance.Count; // 总员工人数,结果3
int totalWorkDays = items.Select(x => x.date).Distinct().Count(); // 有出勤记录的总日期数,结果3,匹配预期

// 人员出勤明细表:直接遍历userAttendance即可输出每位员工的累计工作天数

注:如果业务定义的「总工作天数」为全员累计出勤人天,将totalWorkDays的计算逻辑改为userAttendance.Sum(x => x.WorkDays)即可,该场景下计算结果为6。

内容的提问来源于stack exchange,提问作者jun chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:57:16