你如何构建一个数据结构 - 表示为下面的Schedule类 - 这将为您提供足够的信息,以便为您的ExtensionMethod提供简单且足够的信息,以便它可以设置testResult_#variables
请注意:我不是问如何实现GetScheduleById(string)方法,而是要求以尽可能简单的方式定义Schedule数据结构,提供所有需要有关此方法的信息。
var datetimeUnderTest = DateTime.Now;
Schedule workingDaysSchedule = ScheduleRepository.GetScheduleById("dubaiWorkingDays");
Schedule workingHoursSchedule = ScheduleRepository.GetScheduleById("usaWorkingHours");
Schedule winterSchedule = ScheduleRepository.GetScheduleById("brasilWinter");
Schedule nightsInWeekendSchedule = ScheduleRepository.GetScheduleById("NightsInWeekends");
Schedule nightsInWeekDaysSchedule = ScheduleRepository.GetScheduleById("NightsInWeekDays");
// IsInSchedule is an Extension method on DateTime
bool testResult_0 = datetimeUnderTest.IsInSchedule(workingDaysSchedule );
bool testResult_1= datetimeUnderTest.IsInSchedule(workingHoursSchedule );
bool testResult_2 = datetimeUnderTest.IsInSchedule(winterSchedule);
bool testResult_3 = datetimeUnderTest.IsInSchedule(nightsInWeekendSchedule );
bool testResult_4 = datetimeUnderTest.IsInSchedule(nightsInWeekDaysSchedule );
谢谢!
答案 0 :(得分:1)
我觉得Schedule
只是一个日期/时间范围列表。或者,也许是7周工作日中的每一天的一组时间范围。例如,workingDaysSchedule
可能包含每天(周一至周五)的一个条目。该条目将从00:00到23:59:59。
nightsInWeekendSchedule
都会有周五和周六的参赛作品。
对它进行建模的最简单方法(不一定是效率最高的)可能是:
class TimeRange
{
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
}
class Schedule
{
private List<List<TimeRange>> Days = new List<List<TimeRange>>
{
new List<TimeRange>(), // Sunday
new List<TimeRange>(), // Monday
// etc.
};
public Add(DayOfWeek day, DateTime startTime, DateTime endTime);
public Contains(DateTime test);
}
给定DateTime
值,您可以找到星期几(DateTime.DayOfWeek),然后对当天的范围列表进行线性搜索。
您需要考虑一些并发症。例如,星期五晚上11点到7点的班次实际上是两个范围:星期五晚上11点到午夜,然后星期六凌晨12点01分到星期六早上7点。您添加范围的代码必须拆分范围并添加到星期五和星期六的时间表。
或者,您可以避免Add
方法的复杂化,只需使用集合初始化程序语法对范围进行编码。