这里最简单的数据结构是什么,以提供所需的信息量?

时间:2013-02-17 15:28:11

标签: c# datetime data-structures calendar scheduling

你如何构建一个数据结构 - 表示为下面的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 ); 

谢谢!

1 个答案:

答案 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方法的复杂化,只需使用集合初始化程序语法对范围进行编码。