在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(); }
逻辑说明
- 预处理步骤:将输入的日期集合转换为仅保留日期部分(去除时分秒)的HashSet,既避免重复日期干扰,又能以O(1)的时间复杂度快速判断日期是否存在。
- 生成连续序列:用
Enumerable.Range生成从0开始的整数偏移量,通过AddDays(offset)得到从起始日开始的每一个连续日期。 - 筛选连续有效日期:
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
相关产品推荐
相关产品推荐

