基于有效日期计算工时的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的逻辑,避免出现空引用异常。
测试验证
针对你给出的测试案例:
- 输入
2020-01-01(周三):会筛选出两条记录,取Valid_from=2020-01-01的最新记录,返回ShouldWorkWednesday的6小时,符合期望。 - 输入
2019-12-01(周日):只筛选出Valid_from=2019-12-01的记录,返回ShouldWorkSunday的0小时,符合期望。
内容的提问来源于stack exchange,提问作者Mara
相关产品推荐
相关产品推荐

