3

ExtensionMethod に単純で十分な情報を提供して testResult_# 変数を設定できるようにするための十分な情報を提供するデータ構造(以下の Schedule クラスとして表される)をどのように構築しますか。

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

ありがとう!

4

1 に答える 1

2

aScheduleは単なる日付/時刻範囲のリストであるように私には思えます。または、おそらく7週間の各日の一連の時間範囲です。たとえば、aworkingDaysScheduleは、おそらく1日(月曜日から金曜日)に1つのエントリで構成されます。そのエントリは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時のシフトは、実際には2つの範囲になります。金曜日の午後11時から深夜0時と、土曜日の午前12時1分から午前7時です。範囲を追加するコードは、範囲を分割し、金曜日と土曜日の両方のスケジュールに追加する必要があります。

または、Addメソッドの複雑さを回避し、コレクション初期化構文を使用して範囲をコーディングすることもできます。

于 2013-02-17T19:18:31.970 に答える