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
相关产品推荐
相关产品推荐

