2013-05-14 4 views
1

У меня есть перечисление:Сравните месяц года перечисление с даты и времени в месяц

public enum MonthsOfTheYear 
{ 
    January = 1, 
    February = 2, 
    March = 4, 
    April = 8, 
    May = 16, 
    June = 32, 
    July = 64, 
    August = 128, 
    September = 256, 
    October = 512, 
    November = 1024, 
    December = 2048, 
    AllMonths = 4095, 
} 

и Datime.Now.Month.

Например, если значение месяца равно 5, оно равно «Май», как я могу сравнить с перечислением месяца? Этот пример не работает: если (monthsOfYear.Any (X => x.Code.Equals ((MonthsOfTheYear) (1 < < (currentDateTime.Month - 1)))

+0

'if (DateTime.Now.Month == 5) return MonthsOfTheYear.May'? – dtb

+1

Почему вы используете все полезные ответы? –

+1

@ danrichardson: Почему вы предполагаете, что OP сбивает ответы? –

ответ

8

Это немного странно! способ представления в месяц, но это не так трудно сделать то, что вы хотите.

оператор вам нужно, это осталось немного оператор сдвига, <<. Если представить число в виде строки битов, скажем

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); 

Это дает вам истину, если этот флаг был установлен, иначе ложь.

Имеют смысл?

+0

Если вы собираетесь использовать этот маршрут, я бы порекомендовал бит, смещающий значения перечисления, чтобы у вас не было пюре методов программирования. Я думаю, что это что-то вроде «Январь << 0, Февраль << 1 и т. Д.» –

+0

Это работа, спасибо – zrabzdn

+1

user2382193, я думаю, вы найдете ответы каждого здесь. Вы не должны голосовать голосами без причины. –

Смежные вопросы