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

在C#中计算日期范围内从指定日期开始的连续日期数量

使用LINQ实现连续日期计数函数

可以通过预处理日期集合+生成预期连续序列并匹配的方式,用简洁的LINQ代码实现需求。核心思路是:先对输入的日期范围去重并提取日期部分,然后从起始日期开始生成连续日期序列,直到第一个不在集合中的日期出现,统计前面的有效数量。

实现代码

public static int GetConsecutiveDaysCount(DateTime startDate, IEnumerable<DateTime> dateRange)
{
    // 预处理:提取日期部分、去重,用HashSet提升查找性能
    var uniqueDates = new HashSet<DateTime>(dateRange.Select(d => d.Date));
    
    // 生成从起始日开始的连续日期,筛选出存在于集合中的部分,统计数量
    return Enumerable.Range(0, int.MaxValue)
        .Select(offset => startDate.AddDays(offset))
        .TakeWhile(uniqueDates.Contains)
        .Count();
}

逻辑说明

  1. 预处理步骤:将输入的日期集合转换为仅保留日期部分(去除时分秒)的HashSet,既避免重复日期干扰,又能以O(1)的时间复杂度快速判断日期是否存在。
  2. 生成连续序列:用Enumerable.Range生成从0开始的整数偏移量,通过AddDays(offset)得到从起始日开始的每一个连续日期。
  3. 筛选连续有效日期:TakeWhile会持续保留序列中存在于HashSet的日期,直到遇到第一个不存在的日期为止,最后用Count()得到连续日期的数量。

验证示例

  • 示例1:起始日期2022-09-01,日期范围包含2022/9/1、2022/9/2、2022/9/3、2022/9/4、2022/9/7。生成的连续日期依次为9/1、9/2、9/3、9/4、9/5...,其中9/5不在集合中,最终返回4。
  • 示例2:起始日期2022-09-29,日期范围包含2022/9/29、2022/9/30、2022/10/1、2022/10/4。生成的连续日期依次为9/29、9/30、10/1、10/2...,其中10/2不在集合中,最终返回3。

性能优化说明

如果处理的日期集合规模较大,使用HashSet而非List来存储去重后的日期,能将日期存在性检查的时间复杂度从O(n)降低到O(1),大幅提升函数执行效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:40:28