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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:09:05