Это немного странно! способ представления в месяц, но это не так трудно сделать то, что вы хотите.
оператор вам нужно, это осталось немного оператор сдвига, <<
. Если представить число в виде строки битов, скажем
0000 0000 1111 0000 (240 in binary)
затем операторы сдвига битов сдвинуть их на несколько мест слева или справа; сдвиг влево один будет
0000 0001 1110 0000 (480 in binary)
В вашем случае, январь бит 1 смещается влево ноль раз, февральский бит 1 сдвигается влево на один раз, и так далее:
int may = 5;
MonthsOfTheYear result = (MonthsOfTheYear)(1 << (may - 1));
имеет смысл?
UPDATE:
Что не так с этим кодом?
!monthsOfYear.Any(x=>x.Code.Equals((MonthsOfTheYear)(1 << (currentDateTime.Month - 1)))))
где месяцевOfYear is 1 + 2 + 4 + 8?
У вас есть номер 1 + 2 + 4 + 8, которое 15. То есть не равно к 1, 2, 4 или 8. Вы не хотите равенства в первую очередь.
Чтобы проверить, установлен ли флаг, используйте оператор &
.
Давайте сделаем это легче понять, абстрагируясь прочь в вспомогательный метод:
// Is bit "flag" set in bit field "flags"?
static bool IsFlagSet(int flags, int flag)
{
return (flags & (1 << flag)) != 0;
}
Убедитесь, что вы понимаете, как это работает. Если у вас есть флаги
0000 0011
И вы спрашиваете, если флаг 1 установлен, то он перекладывает бит 1 влево на 1-е место:
0000 0010
А потом говорит: «дайте мне 1, если оба соответствующих бита равны нулю в противном случае ". Так что это
0000 0010
Это не ноль, поэтому флаг должен быть установлен.
Теперь вы можете сказать:
bool result = IsFlagSet((int)monthsOfYear, currentDateTime.Month - 1);
Это дает вам истину, если этот флаг был установлен, иначе ложь.
Имеют смысл?
'if (DateTime.Now.Month == 5) return MonthsOfTheYear.May'? – dtb
Почему вы используете все полезные ответы? –
@ danrichardson: Почему вы предполагаете, что OP сбивает ответы? –