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