3

您将如何构建一个数据结构- 表示为下面的 Schedule 类 - 这将为您提供足够的信息,以便为您的 ExtensionMethod 提供简单且足够的信息,以便它可以设置 testResult_# 变量。

请注意:我不是在问如何实现 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 ); 

谢谢!

4

1 回答 1

2

在我看来, aSchedule只是日期/时间范围的列表。或者,可能在 7 个工作日的每一天中都有一组时间范围。例如,aworkingDaysSchedule可能每天(周一到周五)包含一个条目。该条目将是从 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:00 到早上 7:00 的班次实际上有两个范围:周五晚上 11:00 到午夜,然后是周六上午 12:01 到早上 7:00。您添加范围的代码必须拆分范围并添加到周五和周六的时间表。

或者,您可以避免该Add方法的复杂性,而只需使用集合初始值设定项语法对范围进行编码。

于 2013-02-17T19:18:31.970 回答