如何检测重叠的开始和结束日期时间(C#,ASP.NET,MVC)

时间:2015-03-02 14:30:13

标签: c# asp.net-mvc visual-studio datetime

在我们设计的系统中,要求是在注册新类时检测冲突,并且不确定检测这些冲突(或重叠)的最佳方法是什么。目前我们有两个列表,一个持有类开始时间,另一个持有类结束时间,并尝试使用一系列if语句比较两者。我们的第一个问题是如何比较两个列表,因为列表项存储为DateTimes,我们在尝试比较列表时遇到错误("运算符'> =不能应用于类型&的操作数#39; bool'和bool'")。

此外,我们认为使用多个if语句的方法会因为可能发生重叠的可能组合的数量而变得非常混乱。有没有更有效的方法来解决这个问题?我们已经检查了许多可能的解决方案(包括下面的解决方案),但认为这将涉及写入许多if语句。下面附有一段代码,显示我们目前正在尝试检测冲突。

        List<DateTime> startTimeList = new List<DateTime>();
        List<DateTime> endTimeList = new List<DateTime>();
        foreach (var module in moduleList)
        {
            foreach (var moduleClass in module.ModuleClass)
            {
                foreach (var day in typeof(DayOfWeek).GetEnumNames())
                {
                    // loop through days, instead of hardcoding "monday"
                    if (moduleClass.Day.ToString().Equals(day.ToString()))
                    {

                        //Trying to compare start and end times in this section
                        if (startTimeList.Contains(moduleClass.StartTime) >= endTimeList.Contains(moduleClass.EndTime))
                        {
                            System.Diagnostics.Debug.Write("<----------------------------------------- TIMETABLE CLASH ON MONDAY --------------------------------------------->");
                        }

                        else
                        {
                            startTimeList.Add(moduleClass.StartTime);
                            endTimeList.Add(moduleClass.EndTime);
                        }
                    }
                }
            }
        }

How check intersection of DateTime periods

1 个答案:

答案 0 :(得分:2)

有一行非常简单的代码来检测一对DateTime对象是否重叠:

private bool IsOverlapping(ModuleClass currentClass, ModuleClass potentialClass)
{
    // Where Start & End are DateTime properties on ModuleClass.
    return potentialClass.Start < currentClass.End 
        && currentClass.Start < potentialClass.End;
}

如果您需要将这些与其他所有类别进行比较,那么您需要将每个类别相互比较:

private bool IsOverlapping(List<ModuleClass> classes) 
{
    foreach(var currentClass in classes)
    {
        foreach(var potentialClass in classes.Where(x => x.Id != currentClass.Id))
        {
            // Clash has been found
            if (this.IsOverlapping(currentClass, potentialClass) return true;
        }
    }

    return false;
}

我想指出将List<ModuleClass>分组为几天可能更有效率,以便它只比较一周中同一天的类,然后如果每个列表返回false当传递给IsOverlapping然后你就知道没有冲突,但是你可以扩展它以自己实现它。