我有一个 TimeSpans 列表,我想获取所有重叠 TimeSpans 的持续时间。 (见图)
在这种情况下,持续时间必须是 2.5 小时而不是 3 小时。有人有想法吗?
例子:
“行政”是 40 分钟的约会。 “Tafel dekken”是 30 分钟的约会,但它与“Administratief”重叠,持续时间为 40 分钟 + 10 分钟的“Tafel dekken”。并且您有 30 分钟的“Prolongeren”,因此在这种情况下,持续时间必须为 80 分钟。
最佳答案
一种不需要排序列表的简单但低效的算法 (O(n²)
)。
首先,合并所有重叠区间,然后汇总区间长度(向下滚动):
struct TimeRange
{
DateTime Start;
DateTime End;
public TimeRange(DateTime start, DateTime end)
{
Start = start;
End = end;
}
public TimeSpan Duration
{
get
{
return End-Start;
}
}
public static bool Overlap(TimeRange tr1, TimeRange tr2)
{
return (tr2.Start <= tr1.End && tr1.Start <= tr2.End);
}
public static TimeRange Merge(TimeRange tr1, TimeRange tr2)
{
return new TimeSpan(
(tr1.Start < tr2.Start) ? tr1.Start : tr2.Start,
(tr1.End > tr2.End) ? tr1.End : tr2.End
);
}
}
List<TimeRange> timeRanges; // A *copy* of your data list
for(int i = 0; i < timeRanges.Count; i++)
{
for(int j = i+1; j < timeRanges.Count; j++)
{
if(TimeRange.Overlap(timeRanges[i],timeRanges[j])
{
timeRanges[i] = TimeRange.Merge(timeRanges[i],timeRanges[j]);
timeRanges.RemoveAt(j);
j--;
}
}
}
TimeSpan totalDuration = TimeSpan.Zero;
foreach(TimeRange in timeRanges)
{
totalDuration += timeRanges.Duration;
}
关于c# - 获取重叠间隔的持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34674286/