Compare month of year enum with datetime month
本文关键字:month with datetime enum year of Compare | 更新日期: 2023-09-27 18:13:45
我有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,
}
和Datime.Now.Month。
例如,如果month的值是5,它等于"May",我如何与month enum进行比较?这个例子不起作用:if (! MonthsOfTheYear . any (x=>x. code . equals ((MonthsOfTheYear))(1 <<(currentDateTime。月- 1)
这种表示月份的方式有点奇怪,但要想做到这一点并不困难。
你需要的运算符是左位移位运算符, <<
。如果你把一个数字想象成一串位,写
0000 0000 1111 0000 (240 in binary)
则位移位运算符将其向左或向右移动若干位;左移一个是
0000 0001 1110 0000 (480 in binary)
在你的例子中,一月是1号左移0次的位,二月是1号左移1次的位,以此类推:
int may = 5;
MonthsOfTheYear result = (MonthsOfTheYear)(1 << (may - 1));
有意义吗?
更新:这段代码有什么问题?
!monthsOfYear.Any(x=>x.Code.Equals((MonthsOfTheYear)(1 << (currentDateTime.Month - 1)))))
where monthsOfYear = 1 + 2 + 4 + 8 ?
1 + 2 + 4 + 8等于15。不等于等于1、2、4或8。你一开始就不想要平等。
测试是否设置了一个标志,使用&
操作符。
让我们把它抽象成一个helper方法来让它更容易理解:
// 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,否则为0。"这是
0000 0010
不为零,因此必须设置标志。
现在你可以说:
bool result = IsFlagSet((int)monthsOfYear, currentDateTime.Month - 1);
如果设置了该标志则返回true,否则返回false。
有意义吗?