週の日を表すビット シフト マスクがあります。
Sunday = 1
Monday = 2
Tuesday = 4
...
Saturday = 64
数日 (少なくとも 1 日) が 1 に設定される可能性があるため、ビットマスクを使用しています。
問題
それから私はデートをします。任意の日付。それに基づいてdate.DayOfWeek
、ビットマスクに設定されている最初の最も近い日付を返す必要があります。date
したがって、私のメソッドは、同じ日または ~ の間の任意の日に返すことができdate + 6
ます。
例 1
私のビットマスクは、すべての日が 1 に設定されていることを定義します。この場合、date.DayOfWeek
ビットマスクに が設定されているため、メソッドは同じ日付を返す必要があります。
例 2
私のビットマスクは、水曜日のみが 1 に設定されていることを定義しています。受信日が火曜日の場合、戻る必要がdate+1
あります (これは水曜日です)。ただし、受信日が木曜日の場合は、戻る必要がdate+6
あります (これも水曜日です)。
質問
これを解決する最も速くてエレガントな方法は何ですか? なぜ最速なのですか?これを数回実行する必要があるため、何らかのキャッシュ構造を使用して日付をより速く取得できる場合は、それが優先されます。
これをエレガントな方法で解決するためのガイダンスを提案できますか? ifs ステートメントと switch-case ステートメントでいっぱいの長いスパゲッティ コードで終わりたくありません...
重要: ビットマスクがパフォーマンスの向上とコードの単純化に役立つ場合は、ビットマスクを変更または別のものに置き換えることができることに注意することが重要です。したがって、ビットマスクは石に設定されていません...
可能なアプローチ
1 日あたりのオフセットの配列を生成し、それをプライベート クラス変数に保存するのが賢明です。一度生成し、後で次のように再利用します。
return date.AddDays(cachedDayOffsets[date.DayOfWeek]);
この方法では、ビットマスクをまったく使用しません。唯一の問題は、配列をできるだけ速く、できるだけ短いコードで生成する方法です。