在我们设计的系统中,要求是在注册新类时检测冲突,并且不确定检测这些冲突(或重叠)的最佳方法是什么。目前我们有两个列表,一个持有类开始时间,另一个持有类结束时间,并尝试使用一系列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);
}
}
}
}
}
答案 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
然后你就知道没有冲突,但是你可以扩展它以自己实现它。