Xamarin/C# 统计日期范围周末方法陷死循环,AddDays无法递增日期?
问题根源与修复方案
1. 死循环崩溃直接原因
DateTime是.NET中的不可变值类型,AddDays()方法不会修改原变量的值,而是返回新增指定天数后的新DateTime对象。你在for循环的迭代语句中仅执行了date.AddDays(1),没有将返回的新对象赋值给date,导致date永远等于初始的a.Date,循环条件date <= b.Date永久成立,造成死循环,最终触发内存溢出、应用崩溃。
2. 死循环修复方法
直接修改for循环的迭代逻辑,将新增天数后的结果赋值给date即可:
// 错误写法 // for (DateTime date = a.Date; date <= b.Date; date.AddDays(1)) // 修复后写法 for (DateTime date = a.Date; date <= b.Date; date = date.AddDays(1))
3. 业务逻辑错误修复
你当前的getWeekendCount方法命名是获取周末天数,但实际代码统计的是非周末工作日的数量,后续计算逻辑也存在偏差:
(dateTo.Date - dateFrom.Date).Days得到的是两个日期的间隔天数,计算区间总天数需要加1,例如1号到3号的间隔是2天,实际总天数是3天。- 原有计算逻辑
总天数 - 非周末天数 = 周末天数,和你需求中「总天数扣除周末天数得到工作日」的要求完全相反。
提供两种修复方案可选:
方案A:调整方法逻辑匹配命名(推荐)
public int getWeekendCount(DateTime a, DateTime b) { int weekendCount = 0; for (DateTime date = a.Date; date <= b.Date; date = date.AddDays(1)) { if (date.DayOfWeek is DayOfWeek.Saturday or DayOfWeek.Sunday) { weekendCount++; } } return weekendCount; } // 后续计算调整为:总天数(+1)减去周末天数得到工作日 int totalDays = (dateTo.Date - dateFrom.Date).Days + 1; int workDays = totalDays - count;
方案B:调整方法命名与后续计算
如果要保留统计非周末日期的逻辑,将方法名修改为getWorkdayCount,后续直接使用返回值作为工作日天数即可,无需额外做减法。
4. 优化建议
无需用List<DateTime>存储所有符合条件的日期,直接用变量计数即可,减少不必要的内存开销;调试打印日期时直接打印date变量,打印List<DateTime>不会输出具体的日期值。
内容的提问来源于stack exchange,提问作者aTubOfAdam
相关产品推荐
相关产品推荐

