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

C#中如何将DateTime列表转换为连续日期区间列表

将C#中的List按连续1天间隔分组为子列表

输入示例

var list = new List<DateTime>()
{
    new DateTime(2023, 05, 02),
    new DateTime(2023, 05, 03),
    new DateTime(2023, 05, 04),
    new DateTime(2023, 05, 10),
    new DateTime(2023, 05, 11),
    new DateTime(2023, 05, 20),
};

期望输出结构

{
    {2023-05-02, 2023-05-03, 2023-05-04},
    {2023-05-10, 2023-05-11},
    {2023-05-20}
}

方法一:基础遍历分组

核心逻辑是遍历原列表,维护当前连续日期的子列表,当遇到间隔超过1天的日期时,将当前子列表存入结果并新建子列表。

List<List<DateTime>> GroupConsecutiveDays(List<DateTime> dateList)
{
    var result = new List<List<DateTime>>();
    if (!dateList.Any()) return result;

    var currentGroup = new List<DateTime> { dateList[0] };
    for (int i = 1; i < dateList.Count; i++)
    {
        var prevDate = dateList[i - 1];
        var currentDate = dateList[i];
        // 检查当前日期与上一个日期是否间隔1天
        if ((currentDate - prevDate).TotalDays == 1)
        {
            currentGroup.Add(currentDate);
        }
        else
        {
            result.Add(currentGroup);
            currentGroup = new List<DateTime> { currentDate };
        }
    }
    // 加入最后一组未完成的连续日期
    result.Add(currentGroup);
    return result;
}

调用验证

var groupedList = GroupConsecutiveDays(list);
foreach (var group in groupedList)
{
    Console.WriteLine(string.Join(", ", group.Select(d => d.ToString("yyyy-MM-dd"))));
}

输出结果:

2023-05-02, 2023-05-03, 2023-05-04
2023-05-10, 2023-05-11
2023-05-20

方法二:LINQ分组实现

通过计算每个日期的分组键(日期减去其在列表中的索引天数),连续的日期会生成相同的键,以此实现分组。

var groupedList = list
    .Select((date, index) => new { Date = date, GroupKey = date.AddDays(-index) })
    .GroupBy(item => item.GroupKey)
    .Select(group => group.Select(item => item.Date).ToList())
    .ToList();

逻辑说明:连续日期的date.AddDays(-index)结果会一致,比如2023-05-02(索引0)减0天为2023-05-02;2023-05-03(索引1)减1天也为2023-05-02,因此会被分到同一组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:35:16