C# 合并重叠时间段,重叠日期按照优先级合并
时间: 2023-07-12 21:51:03 浏览: 90
您好!针对您的问题,我可以给您提供一些思路和代码实现。
首先,对于合并重叠时间段的问题,可以使用以下思路:
1. 将时间段按照起始时间排序;
2. 遍历时间段,如果当前时间段与前一个时间段重叠,则将其合并为一个时间段,否则将当前时间段添加到结果列表中。
具体实现可以参考以下代码:
```csharp
public static List<(DateTime start, DateTime end)> MergeOverlapIntervals(List<(DateTime start, DateTime end)> intervals)
{
// 将时间段按照起始时间排序
intervals = intervals.OrderBy(x => x.start).ToList();
var mergedIntervals = new List<(DateTime start, DateTime end)>();
var currentInterval = intervals[0];
for (int i = 1; i < intervals.Count; i++)
{
var interval = intervals[i];
// 如果当前时间段与前一个时间段重叠,则将其合并为一个时间段
if (currentInterval.end >= interval.start)
{
currentInterval = (currentInterval.start, interval.end);
}
else
{
// 否则将当前时间段添加到结果列表中
mergedIntervals.Add(currentInterval);
currentInterval = interval;
}
}
// 添加最后一个时间段
mergedIntervals.Add(currentInterval);
return mergedIntervals;
}
```
接下来,对于重叠日期按照优先级合并的问题,可以使用以下思路:
1. 将时间段按照起始时间排序;
2. 遍历时间段,如果当前时间段与前一个时间段重叠并且优先级高于前一个时间段,则将其合并为一个时间段,否则将当前时间段添加到结果列表中。
具体实现可以参考以下代码:
```csharp
public static List<(DateTime start, DateTime end, int priority)> MergeOverlapIntervalsWithPriority(List<(DateTime start, DateTime end, int priority)> intervals)
{
// 将时间段按照起始时间排序
intervals = intervals.OrderBy(x => x.start).ToList();
var mergedIntervals = new List<(DateTime start, DateTime end, int priority)>();
var currentInterval = intervals[0];
for (int i = 1; i < intervals.Count; i++)
{
var interval = intervals[i];
// 如果当前时间段与前一个时间段重叠并且优先级高于前一个时间段,则将其合并为一个时间段
if (currentInterval.end >= interval.start && currentInterval.priority <= interval.priority)
{
currentInterval = (currentInterval.start, interval.end, interval.priority);
}
else
{
// 否则将当前时间段添加到结果列表中
mergedIntervals.Add(currentInterval);
currentInterval = interval;
}
}
// 添加最后一个时间段
mergedIntervals.Add(currentInterval);
return mergedIntervals;
}
```
希望以上代码可以对您有所帮助!如果您还有其他问题,欢迎继续提问。
阅读全文