【问题标题】:What is the simplest data-structure here to provide needed amount of info?这里提供所需信息量的最简单的数据结构是什么?
【发布时间】:2013-02-17 15:28:11
【问题描述】:

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

请注意:我不是在问如何实现 GetScheduleById(string) 方法,而是要求以一种可以通过提供所有此方法所需的信息。

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 ); 

谢谢!

【问题讨论】:

  • 这听起来像是 规范模式 - en.wikipedia.org/wiki/Specification_pattern 可能能够提供帮助的东西。定义可用性规范,然后将接收者传递给规范以确定它们是否满足规范,即它们是否可用。
  • 我认为这主要是为了找到一种方便的方法来定义适当的 DataStructure,该数据结构可以携带足够的信息来帮助回答这些问题。
  • 基本上是的。您能否详细说明您的问题,因为我不能 100% 确定您要问的是什么。您能从问题所在以及您目前遇到的情况开始吗?
  • 我重新问了这个问题。我希望这次更清楚。
  • HashMap(或字典)是否适用于 ScheduleRepository?其中键是Id,值是Schedule。 GetScheduleById 将映射到 TryGetValue,IsInSchedule 将映射到 containsKey。

标签: c# datetime data-structures calendar scheduling


【解决方案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:00 到早上 7:00 的班次实际上有两个范围:周五晚上 11:00 到午夜,然后是周六上午 12:01 到早上 7:00。您添加范围的代码必须拆分范围并添加到周五和周六的日程安排中。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    相关资源
    最近更新 更多