如何检测重叠的开始和结束日期时间(C#、ASP.NET、MVC)
How to detect overlapping start and end datetimes (C#, ASP.NET, MVC)
在我们设计的系统中,一项要求是在注册新 classes 时检测冲突,并且不确定检测这些冲突(或重叠)的最佳方法是什么。目前我们有两个列表,一个包含 class 个开始时间,另一个包含 class 个结束时间,并尝试使用一系列 if 语句来比较两者。我们的第一个问题是如何比较两个列表,因为列表项存储为日期时间,我们在尝试比较列表时遇到错误 ("Operator '>= cannot be applied to operands of type 'bool' and '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
有一行非常简单的代码来检测一对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;
}
如果您需要将它们与其他所有可能的东西进行比较 class 那么您需要将它们相互比较:
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>
分组为几天可能更有效,这样它只比较一周中同一天的 class,然后如果每个列表 returns 在传递给 IsOverlapping
时为 false 那么您知道没有冲突,但是您可以扩展它以自己实现它。
在我们设计的系统中,一项要求是在注册新 classes 时检测冲突,并且不确定检测这些冲突(或重叠)的最佳方法是什么。目前我们有两个列表,一个包含 class 个开始时间,另一个包含 class 个结束时间,并尝试使用一系列 if 语句来比较两者。我们的第一个问题是如何比较两个列表,因为列表项存储为日期时间,我们在尝试比较列表时遇到错误 ("Operator '>= cannot be applied to operands of type 'bool' and '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
有一行非常简单的代码来检测一对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;
}
如果您需要将它们与其他所有可能的东西进行比较 class 那么您需要将它们相互比较:
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>
分组为几天可能更有效,这样它只比较一周中同一天的 class,然后如果每个列表 returns 在传递给 IsOverlapping
时为 false 那么您知道没有冲突,但是您可以扩展它以自己实现它。