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

基于有效日期计算工时的C#代码问题求助

修正方案:获取最新生效的工作时长记录

你的问题核心是错误地累加了所有符合日期条件的记录,而我们只需要取其中Valid_from最晚且不晚于指定日期的那一条来计算当日应工作时长。下面是修正后的代码和详细解释:

修正后的代码

public TimeSpan GetHoursForDay(DateTime day) {
    // 第一步:筛选出所有生效日期不晚于指定日期的记录
    var applicableRecords = shouldWorkTime.Where(t => t.Valid_from <= day).ToList();
    
    // 如果没有符合条件的记录,返回0时长
    if (!applicableRecords.Any()) {
        return TimeSpan.Zero;
    }
    
    // 第二步:找到其中生效日期最晚的那条记录
    var latestEffectiveRecord = applicableRecords
        .OrderByDescending(t => t.Valid_from)
        .FirstOrDefault();
    
    // 第三步:根据指定日期的星期,从最新记录中获取对应的时长
    return day.DayOfWeek switch {
        DayOfWeek.Monday => latestEffectiveRecord.ShouldWorkMonday,
        DayOfWeek.Tuesday => latestEffectiveRecord.ShouldWorkTuesday,
        DayOfWeek.Wednesday => latestEffectiveRecord.ShouldWorkWednesday,
        DayOfWeek.Thursday => latestEffectiveRecord.ShouldWorkThursday,
        DayOfWeek.Friday => latestEffectiveRecord.ShouldWorkFriday,
        DayOfWeek.Saturday => latestEffectiveRecord.ShouldWorkSaturday,
        DayOfWeek.Sunday => latestEffectiveRecord.ShouldWorkSunday,
        _ => TimeSpan.Zero
    };
}

关键改动说明

  • 筛选+取最新记录:不再遍历所有符合条件的记录累加,而是先筛选出所有生效日期≤指定日期的记录,再通过OrderByDescending按Valid_from倒序排列,取第一条就是最新生效的规则。
  • 简化星期判断:用C#的switch表达式替代了多个if判断,代码更简洁易读(如果使用的是旧版本C#,可以换回原来的if结构,逻辑完全一致)。
  • 边界处理:增加了无符合条件记录时返回0的逻辑,避免出现空引用异常。

测试验证

针对你给出的测试案例:

  1. 输入2020-01-01(周三):会筛选出两条记录,取Valid_from=2020-01-01的最新记录,返回ShouldWorkWednesday的6小时,符合期望。
  2. 输入2019-12-01(周日):只筛选出Valid_from=2019-12-01的记录,返回ShouldWorkSunday的0小时,符合期望。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:47:53