C# 合并重叠时间段,按照级别的优先级合并,重叠的日期按照优先级大小合并
时间: 2024-03-27 22:37:00 浏览: 103
您可以使用C#中的LINQ语言来实现合并重叠时间段的操作。以下是一个示例代码,其中假设您的时间段是一个包含开始时间和结束时间的元组列表,并且每个时间段都有一个优先级。
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
public class Program {
public static void Main() {
// 假设您有一个包含时间段和优先级的列表
var timeIntervals = new List<(DateTime start, DateTime end, int priority)> {
(new DateTime(2021, 10, 1, 9, 0, 0), new DateTime(2021, 10, 1, 10, 0, 0), 2),
(new DateTime(2021, 10, 1, 10, 0, 0), new DateTime(2021, 10, 1, 11, 0, 0), 1),
(new DateTime(2021, 10, 1, 11, 0, 0), new DateTime(2021, 10, 1, 12, 0, 0), 3),
(new DateTime(2021, 10, 1, 12, 0, 0), new DateTime(2021, 10, 1, 13, 0, 0), 2),
(new DateTime(2021, 10, 1, 13, 0, 0), new DateTime(2021, 10, 1, 14, 0, 0), 1)
};
// 首先按照开始时间进行排序
var sortedIntervals = timeIntervals.OrderBy(ti => ti.start);
// 然后使用LINQ的Aggregate方法来合并重叠的时间段
var mergedIntervals = sortedIntervals.Aggregate(
new List<(DateTime start, DateTime end, int priority)>(),
(mergedList, nextInterval) => {
// 如果列表为空或者当前时间段与前一个时间段不重叠,则将当前时间段添加到列表末尾
if (mergedList.Count == 0 || mergedList.Last().end <= nextInterval.start) {
mergedList.Add(nextInterval);
}
// 否则,合并当前时间段和前一个时间段
else {
var lastInterval = mergedList.Last();
var mergedInterval = (
start: lastInterval.start,
end: nextInterval.end,
priority: Math.Max(lastInterval.priority, nextInterval.priority)
);
mergedList[mergedList.Count - 1] = mergedInterval;
}
return mergedList;
}
);
// 输出合并后的时间段
foreach (var mergedInterval in mergedIntervals) {
Console.WriteLine($"{mergedInterval.start} - {mergedInterval.end} (priority: {mergedInterval.priority})");
}
}
}
```
在这个示例中,我们首先使用LINQ的OrderBy方法将时间段按照开始时间进行排序。然后,我们使用Aggregate方法依次遍历每个时间段,并将其合并到结果列表中。如果当前时间段与前一个时间段不重叠,则将其添加到列表末尾;否则,我们将当前时间段和前一个时间段合并,并将结果替换列表中的最后一个元素。最终,我们将合并后的时间段输出到控制台。
阅读全文