c# - 获取重叠间隔的持续时间

标签 c# datetime timespan duration overlapping

我有一个 TimeSpans 列表,我想获取所有重叠 TimeSpans 的持续时间。 (见图)

enter image description here

在这种情况下,持续时间必须是 2.5 小时而不是 3 小时。有人有想法吗?

例子:

enter image description here

“行政”是 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/

相关文章:

c# - 如何在 C# 中生成上午 12 点到下午 6 点之间的随机时间?

asp.net - 您可以在 ASP.NET Web 应用程序中覆盖 Date.Now 或 Date.Today 以进行调试吗?

c# - ListDirectoryDe​​tails 行上的正则表达式

c# - 我希望任务处理抛出的任何异常,但发现很难阻止它们到达父级

c# - 静态变量与静态属性

python - 为 Pandas 系列的 float 分配日期

MySQL 存储过程 - 嵌套循环出错?

c# - 如何将刻度转换为分钟?

ActionScript 3.0 + 计算两个日期之间的时间跨度?

c# - 仅应用程序洞察日志异常