1List<T>
日 24 時間以内に 1 つの利用可能な時間とTimeSpans
、minTime と maxTime の 2 つがあります。
List<T>
との間にある時刻を見つける必要がありますが、これは複数のタイムゾーンで使用されているため、minTimeminTime
とmaxTime
maxTime は別々の日になり、午後 1 時から翌日の午前 1 時までの範囲になる可能性があります。
私が最も近いのはこれですが、ここでいくつかの主要なコンポーネントが欠けているか、TimeSpan
オブジェクトにかなり慣れていないため、非常に非効率的なことをしているように感じます. 私はちょうど何を理解することはできません...
// Make new TimeSpan out of maxTime to eliminate any extra days (TotalHours >= 24),
// then check if time on the MaxTime is earlier than the MinTime
if (new TimeSpan(maxTime.Hours, maxTime.Minutes, maxTime.Seconds) < minTime)
{
// If time on MaxTime is earlier than MinTime, the two times span separate days,
// so find first time after minTime OR before maxTime
nextAvailableTime = Times.FirstOrDefault(p =>
(p.Time.TimeOfDay >= minTime || (p.Time.TimeOfDay < maxTime))
&& p.Count < ConcurrentAppointments);
}
else
{
// If time on MaxTime is later than MinTime, the two times are for the same day
// so find first time after minTime AND before maxTime
nextAvailableTime = Times.FirstOrDefault(p =>
(p.Time.TimeOfDay >= minTime && p.Time.TimeOfDay < maxTime)
&& p.Count < ConcurrentAppointments);
}
リストでTimes
は EST (現地時間) を使用していますが、minTime
とmaxTime
は他のタイム ゾーンに基づいている場合があります。
たとえば、ハワイのタイム ゾーンでこのアルゴリズムを実行した場合、最終的にminTime = new TimeSpan(13, 0, 0)
andが得られmaxTime = new TimeSpan(25, 0, 0)
ます。
Times
コレクションは でList<AppointmentTime>
あり、クラスは次のAppointmentTime
ようになります。
class AppointmentTime
{
DateTime Time { get; set; }
int Count { get; set; }
}
ここで大きな何かが欠けているか、私が気付いていないより効率的な方法があるはずだと確信していますが、それが何であるかは本当にわかりません。私のアルゴリズムに何か問題がありますか? または、別々の日にまたがる可能性のあるTimeOfDay
2 つの間のより効率的な方法はありますか?TimeSpans
アップデート
CasperOne's answerに基づいて、何が欠けているかを突き止めました。私の時間は異なるタイムゾーンにまたがっているので、日付が実際に重要であることを忘れていました.
上記のハワイ タイム ゾーンの例を使用すると、月曜日に予定をスケジュールすると、日曜日の夜にハワイの予定が誤ってスケジュールされてしまいます。
私の解決策は、24時間の「最初のウィンドウ」の予定をスケジュールする前に前日が有効であることを確認し.AddDays(maxTime.Days)
、maxTime
// If time on MaxTime is earlier than MinTime, the two times span separate days,
// so find first time after minTime OR before maxTime if previous day has appointments set as well
var isPreviousDayValid = IsValidDate(AppointmentDate.AddDays(-1));
nextAvailableTime = Times.FirstOrDefault(p =>
(p.Time.TimeOfDay >= minTime
|| (p.Time.AddDays(maxTime.Days).TimeOfDay < maxTime && isPreviousDayValid)
) && p.Count < ConcurrentAppointments);