gpt4 book ai didi

c# - 比较一年中的月份与日期时间的月份

转载 作者:太空宇宙 更新时间:2023-11-03 18:10:32 25 4
gpt4 key购买 nike

我有枚举:

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枚举进行比较?
这个例子不起作用:
如果(!monthsOfYear.Any(x => x.Code.Equals((MonthsOfTheYear)(1 <<(currentDateTime.Month-1))))

最佳答案

这是代表一个月的一种奇怪的方式,但是要做您想要的并不难。

您需要的运算符是左移位运算符<<。如果您将数字想象成一串比特,请说

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


说得通?

更新:


  此代码有什么问题?

!monthsOfYear.Any(x=>x.Code.Equals((MonthsOfTheYear)(1 << (currentDateTime.Month - 1)))))

  
  在monthOfYear是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,否则为0。”所以那是

0000 0010


这不为零,因此必须已设置标志。

现在您可以说:

bool result = IsFlagSet((int)monthsOfYear, currentDateTime.Month - 1);


如果设置了该标志,则为true;否则为false。

说得通?

关于c# - 比较一年中的月份与日期时间的月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16546301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com