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)

Compare month of year enum with datetime month

这种表示月份的方式有点奇怪,但要想做到这一点并不困难。

你需要的运算符是左位移位运算符<<。如果你把一个数字想象成一串位,写

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。

有意义吗?