我有枚举:
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,则等于“5月”,我如何与月份枚举进行比较? 这个例子不起作用: if(!monthsOfYear.Any(x => x.Code.Equals((MonthsOfTheYear)(1<(currentDateTime.Month - 1)))
答案 0 :(得分:8)
这是一个代表一个月的奇怪方式,但要做你想做的事并不难。
您需要的运算符是左移位运算符,<<
。如果您将数字想象为一串位,请说
0000 0000 1111 0000 (240 in binary)
然后位移操作符将它们向左或向右移动一些位置;向左移动将是
0000 0001 1110 0000 (480 in binary)
在你的情况下,1月是第1位向左移动零次,2月是第1位向左移动一次,依此类推:
int may = 5;
MonthsOfTheYear result = (MonthsOfTheYear)(1 << (may - 1));
有意义吗?
更新:
此代码有什么问题?
!monthsOfYear.Any(x=>x.Code.Equals((MonthsOfTheYear)(1 << (currentDateTime.Month - 1)))))
其中monthsOfYear是1 + 2 + 4 + 8?
您的数字为1 + 2 + 4 + 8,即15。这不是等于为1,2,4或8.您首先不需要相等。< / p>
要测试是否设置了标志,请使用&
运算符。
让我们通过抽象出一个辅助方法来更容易理解:
// 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);
如果设置了该标志,则为true,否则为false。
有意义吗?