У меня есть маска сдвига битов, которая представляет дни недели:
Sunday = 1
Monday = 2
Tuesday = 4
...
Saturday = 64
Я использую битовую маску, потому что несколько (по крайней мере, один) дней могут быть установлены на 1.
Эта проблема
Тогда я назначаю свидание. Любая дата. И на основе date.DayOfWeek
мне нужно вернуть первую ближайшую дату после нее, которая установлена в битовой маске. Таким образом, мой метод может вернуться в тот же день или в любой другой день между date
и date + 6
.
Пример 1
Моя битовая маска определяет, что для всех дней установлено значение 1. В этом случае мой метод должен возвращать одну и ту же дату, потому что в битовой маске установлено date.DayOfWeek
.
Пример 2
Моя битовая маска определяет, что только среда имеет значение 1. Если моя входящая дата — вторник, я должен вернуть date+1
(что является средой). Но если входящая дата - четверг, я должен вернуть date+6
(что снова среда).
Вопрос
Каков самый быстрый и элегантный способ решить эту проблему? Почему еще и самый быстрый? Потому что мне нужно запустить это несколько раз, поэтому, если бы я мог использовать какую-то кешированную структуру для более быстрого получения дат, это было бы предпочтительнее.
Можете ли вы предложить некоторые рекомендации, чтобы решить эту проблему элегантным способом? Я не хочу получить длинный спагетти-код, полный операторов if и switch-case...
Важно. Важно отметить, что битовая маска может быть изменена или заменена чем-то другим, если это способствует повышению производительности и простоте кода. Так что битовая маска не высечена в камне...
Возможный подход
Было бы разумно сгенерировать массив смещений за день и сохранить его в частной переменной класса. Создайте его один раз, а затем повторно используйте, например:
return date.AddDays(cachedDayOffsets[date.DayOfWeek]);
Таким образом, мы вообще не используем битовую маску, и единственная проблема заключается в том, как сгенерировать массив максимально быстро и с максимально коротким кодом.