C# 求按照级别合并重叠时间段,重叠日期是上一个结束日期
时间: 2024-03-27 16:35:34 浏览: 108
表单校验时间段重叠问题
假设有一个时间段列表,每个时间段用起始时间、结束时间和级别表示,如下:
```
List<(DateTime start, DateTime end, int level)> timeRanges = new List<(DateTime start, DateTime end, int level)>
{
(new DateTime(2022, 1, 1), new DateTime(2022, 1, 5), 1),
(new DateTime(2022, 1, 4), new DateTime(2022, 1, 7), 2),
(new DateTime(2022, 1, 6), new DateTime(2022, 1, 8), 1),
(new DateTime(2022, 1, 10), new DateTime(2022, 1, 15), 2),
(new DateTime(2022, 1, 12), new DateTime(2022, 1, 14), 1)
};
```
要求按照级别合并重叠的时间段,重叠日期应为上一个结束日期。可以按照如下步骤进行操作:
1. 先将时间段按照级别和起始时间排序,确保时间段是连续的。
2. 遍历时间段列表,依次比较当前时间段和前一个时间段的结束时间,如果当前时间段的起始时间早于等于前一个时间段的结束时间,则说明两个时间段有重叠部分,需要进行合并。
3. 合并的时候,新的时间段的起始时间为前一个时间段的起始时间,结束时间为当前时间段和前一个时间段的结束时间的最大值。
下面是实现的示例代码:
```
timeRanges.Sort((x, y) =>
{
int result = x.level.CompareTo(y.level);
if (result == 0)
{
result = x.start.CompareTo(y.start);
}
return result;
}); // 按照级别和起始时间排序
List<(DateTime start, DateTime end, int level)> mergedTimeRanges = new List<(DateTime start, DateTime end, int level)>();
foreach (var timeRange in timeRanges)
{
if (mergedTimeRanges.Count == 0 || timeRange.start > mergedTimeRanges.Last().end || timeRange.level != mergedTimeRanges.Last().level)
{
// 当前时间段和前一个时间段没有重叠部分,直接添加到合并后的列表
mergedTimeRanges.Add(timeRange);
}
else
{
// 当前时间段和前一个时间段有重叠部分,合并后更新合并后的列表最后一个时间段
var lastTimeRange = mergedTimeRanges.Last();
var newTimeRange = (lastTimeRange.start, timeRange.end > lastTimeRange.end ? timeRange.end : lastTimeRange.end, lastTimeRange.level);
mergedTimeRanges[mergedTimeRanges.Count - 1] = newTimeRange;
}
}
foreach (var mergedTimeRange in mergedTimeRanges)
{
Console.WriteLine($"合并后的时间段为:{mergedTimeRange.start} - {mergedTimeRange.end},级别为{mergedTimeRange.level}");
}
```
输出结果为:
```
合并后的时间段为:2022/1/1 0:00:00 - 2022/1/7 0:00:00,级别为1
合并后的时间段为:2022/1/4 0:00:00 - 2022/1/8 0:00:00,级别为2
合并后的时间段为:2022/1/10 0:00:00 - 2022/1/15 0:00:00,级别为2
合并后的时间段为:2022/1/12 0:00:00 - 2022/1/14 0:00:00,级别为1
```
可以看到,时间段已经成功按照级别合并,重叠日期也是上一个结束日期。
阅读全文