C# list 时间段,判断是否重复,重复按照优先级合并
时间: 2023-07-12 19:51:14 浏览: 261
C#判断数据是否存在,是否重复录入
好的,下面是一个 C# 的示例代码,可以对一组时间段进行判断,判断它们是否有重叠部分,并且如果有重叠部分,能够按照优先级将它们合并。
```csharp
using System;
using System.Collections.Generic;
public class TimeInterval
{
public DateTime Start { get; set; }
public DateTime End { get; set; }
public int Priority { get; set; }
}
public static class TimeIntervalExtensions
{
public static List<TimeInterval> Merge(this List<TimeInterval> intervals)
{
// 按照起始时间升序排序
intervals.Sort((a, b) => a.Start.CompareTo(b.Start));
List<TimeInterval> merged = new List<TimeInterval>();
TimeInterval current = null;
foreach (TimeInterval interval in intervals)
{
// 如果当前时间段不存在,或者与当前时间段没有重叠部分
if (current == null || interval.Start > current.End)
{
// 直接添加到结果中
merged.Add(interval);
current = interval;
}
// 如果与当前时间段存在重叠部分
else if (interval.End > current.End)
{
// 将当前时间段的结束时间更新为较晚的时间
current.End = interval.End;
}
// 如果两个时间段有相同的起始时间,按照优先级合并
if (interval.Start == current.Start && interval.Priority > current.Priority)
{
current.Priority = interval.Priority;
}
}
return merged;
}
}
// 示例用法
public static void Main()
{
List<TimeInterval> intervals = new List<TimeInterval>
{
new TimeInterval { Start = new DateTime(2021, 1, 1, 9, 0, 0), End = new DateTime(2021, 1, 1, 10, 0, 0), Priority = 2 },
new TimeInterval { Start = new DateTime(2021, 1, 1, 9, 30, 0), End = new DateTime(2021, 1, 1, 11, 0, 0), Priority = 1 },
new TimeInterval { Start = new DateTime(2021, 1, 1, 11, 0, 0), End = new DateTime(2021, 1, 1, 12, 0, 0), Priority = 3 },
};
List<TimeInterval> merged = intervals.Merge();
foreach (TimeInterval interval in merged)
{
Console.WriteLine($"Start: {interval.Start}, End: {interval.End}, Priority: {interval.Priority}");
}
}
```
这里我们定义了一个 `TimeInterval` 类,其中包含了时间段的起始时间、结束时间和优先级属性。然后我们定义了一个静态扩展方法 `Merge`,用于将一组时间段进行合并。在 `Merge` 方法中,我们首先按照起始时间升序排序,然后遍历每个时间段,将它们合并到一个新的列表中。
对于每个时间段,我们检查它与当前时间段是否有重叠部分。如果没有重叠部分,我们直接将它添加到结果列表中,并将当前时间段更新为它。如果有重叠部分,我们将当前时间段的结束时间更新为较晚的时间。
最后,我们还添加了一个判断,如果两个时间段有相同的起始时间,我们按照优先级将它们合并。
希望这个示例代码能够帮助到你!
阅读全文