フレーズまたは文を読み取り、スケジュール/タイミング情報を解析する文字列パーサーに取り組んでいます。たとえば、入力には次のフレーズが含まれる場合があります。
「1日2回」
また
「月曜日、水曜日、金曜日」
DateTimes
目標は、開始日と終了日が指定されたときのリストに変換できるテンプレートを作成することです。このテンプレートを次のように保存することを考えましたFunc<DateTime, bool>
:
(d => d.TimeOfDay == TimeSpan.FromHours(8) || d.TimeOFDay == TimeSpan.FromHours(18))
前者の例は、最も意味のある時間として解釈される可能性があります。
後者の例は と解釈できます(d => d.TimeOfDay == TimeSpan.FromHours(8) && (d.DayOfWeek == Monday || d.DayOfWeek == Wednesday || d.DayOfWeek == Friday))
。
次に、開始日と終了日の間を 1 時間ごとにループし、関数が true を返す場合にその時間をスケジュールに追加します。
私が問題を抱えているのは、解析です。私の現在の解決策は、予想されるすべてのフレーズと適切なフィルターを値として含む辞書を作成することです。ただし、これは非常に厄介で持続不可能に見え始めており、特にオーバーラップの可能性があるためです。
var phrases = new Dictionary<string, Func<DateTime, bool>>()
{
{ "DAILY", (d => true) },
{ "A DAY", (d => true) },
{ "PER DAY", (d => true) },
{ "EVERY DAY", (d => true) },
{ "SUNDAY", (d => d.DayOfWeek == DayOfWeek.Sunday) },
{ "SUN", (d => d.DayOfWeek == DayOfWeek.Sunday) },
{ "MONDAY", (d => d.DayOfWeek == DayOfWeek.Monday) },
{ "MON", (d => d.DayOfWeek == DayOfWeek.Monday) },
. . .
}
これを行うためのより良い方法は何ですか?