c# - Compare month of year enum with datetime month -
i have enum:
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, }
and datime.now.month.
for example if value of month 5 equals "may", how can compare month enum? example not work: if (!monthsofyear.any(x=>x.code.equals((monthsoftheyear)(1 << (currentdatetime.month - 1)))
this bit of strange way represent month, not difficult want.
the operator need left bit shift operator, <<
. if imagine number string of bits,
0000 0000 1111 0000 (240 in binary)
then bit shift operators shift them number of places left or right; shifting left 1
0000 0001 1110 0000 (480 in binary)
in case, january bit 1 shifted left 0 times, february bit 1 shifted left 1 time, , on:
int may = 5; monthsoftheyear result = (monthsoftheyear)(1 << (may - 1));
make sense?
update:
what wrong code?
!monthsofyear.any(x=>x.code.equals((monthsoftheyear)(1 << (currentdatetime.month - 1)))))
where monthsofyear 1 + 2 + 4 + 8 ?
you have number 1 + 2 + 4 + 8 15. not equal 1, 2, 4 or 8. don't want equality in first place.
to test whether flag set, use &
operator.
let's make easier understand abstracting away helper method:
// bit "flag" set in bit field "flags"? static bool isflagset(int flags, int flag) { return (flags & (1 << flag)) != 0; }
make sure understand how works. if have flags
0000 0011
and ask if flag 1 set shifts bit 1 left 1 place:
0000 0010
and says "give me 1 if both corresponding bits set, 0 otherwise." that's
0000 0010
that not zero, flag must have been set.
now can say:
bool result = isflagset((int)monthsofyear, currentdatetime.month - 1);
this gives true if flag set, false otherwise.
make sense?
Comments
Post a Comment