【问题标题】:How to compare standard DayOfWeek to own with Flag如何将标准 DayOfWeek 与 Flag 进行比较
【发布时间】:2019-11-05 08:43:45
【问题描述】:

我有自己的 DaysOfWeek 标志枚举(类似于 https://docs.microsoft.com/en-us/previous-versions/ms886541(v=msdn.10)

[Flags]
public enum DayOfWeek
{
    Sunday = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32
}

我需要将标准 DayOfWeek 与我的进行比较。我该怎么做?

【问题讨论】:

  • 如果您定义“比较”以及您想要的结果是什么,将会很有帮助。这个比较会返回bool 还是int?在将您的DayOfWeekSystem.DayOfWeek 进行比较时,它是严格测试相等性,还是给出System.DayOfWeek,即在您的DayOfWeek 中设置了相应的标志,而不管其他标志的状态如何?另外,你试过什么?
  • 旁注,但你确定Sunday = 0 吗?很难在集合中包含或排除周日。
  • @BACON 我有自己的枚举来创建天数组合,我需要在这个组合中定义 DateTime.Now。想回bool

标签: c# datetime dayofweek


【解决方案1】:

由于您的枚举使用与内置 DayOfWeek 相同的天数顺序,您需要做的就是使用 DayOfWeek 类型的变量作为 2 的指数,然后按位与你的枚举变量。

类似这样的东西(这将检查您的枚举的Monday 标志是否为1):

MyDayOfWeek Days = MyDayOfWeek.Monday | MyDayOfWeek.Friday;
DayOfWeek D = DayOfWeek.Monday;
var Mask = 1 << (int)D;

if ((Mask & (int)Days) == Mask)
  //Do whatever;

我已将您的枚举重命名为 MyDaysOfWeek,而 DayOfWeek 是内置的 .NET 类型。您可以在一周中的任何一天都这样做。

编辑

正如@HenkHolterman 指出的那样(谢谢),将Sunday 设置为0 会有问题。 Flags 枚举通常应该以一个名为 None 的成员开头,该成员等于 0,这表明没有设置任何变量标志。

【讨论】:

  • 对于 C# 中 2 的计算能力,您希望使用 1 &lt;&lt; N 而不是 2 ^ N。后者是异或。
  • 另外,按位与不是必需的。左移1 将创建一个仅设置一位的数字。
  • @BenVoigt:使用两种语言工作可能会很麻烦。那个来自Visual Basic。感谢您的指正。已更新。
  • @BenVoigt:您能否建议如何避免 ANDing?他的枚举标记为Flags,可以设置多个位。
  • 你用MyDayOfWeek.Sunday测试过这个吗?
【解决方案2】:

感谢大家的帮助。 终于有办法了

自己的 DaysOfWeek 带有标志:

[Flags]
public enum DaysOfWeek
{
    None = 0,
    Sunday = 1 << 0,
    Monday = 1 << 1,
    Tuesday = 1 << 2,
    Wednesday = 1 << 3,
    Thursday = 1 << 4,
    Friday = 1 << 5,
    Saturday = 1 << 6,
}

由于自己的枚举具有相同的天数,我们可以编写扩展方法将标准的 DayOfWeek 转换为自己的

public static class EnumExtensions
{
    public static DaysOfWeek ToFlag(this DayOfWeek dayOfWeek)
    {
        var mask = 1 << (int)dayOfWeek;
        return (DaysOfWeek)Enum.ToObject(typeof(DaysOfWeek), mask);
    }
}

及用法:

  var days = DaysOfWeek.Sunday | DaysOfWeek.Friday;
  var day = DayOfWeek.Sunday;
  var ownDay = day.ToFlag();
  if (days.HasFlag(ownDay))
      // Do whatever;

游乐场:https://dotnetfiddle.net/sV3yge

【讨论】:

    【解决方案3】:
    public enum BitwiseDayOfWeek
    {
        Sunday   = 1,
        Monday   = 2,
        Tuesday  = 4,
        Wednesday    = 8,
        Thursday     = 16,
        Friday   = 32,
        Saturday     = 64
    }
    
    public class Program
    {
        public static void Main(string[] args)
        {
            BitwiseDayOfWeek scheduledDayOfWeek
                = BitwiseDayOfWeek.Saturday | BitwiseDayOfWeek.Sunday;
    
            // turn System.DayOfWeek (DateTime.Now.DayOfWeek) into BitwiseDayOfWeek
            BitwiseDayOfWeek currentDayOfWeek
                = (BitwiseDayOfWeek)Math.Pow(2, (double)DateTime.Now.DayOfWeek);
    
            // test if today is the scheduled day
            if ( (currentDayOfWeek & scheduledDayOfWeek) == currentDayOfWeek )
                Console.WriteLine(currentDayOfWeek);
    
            Console.WriteLine("---------------------");
            Console.ReadLine();
        }
    }
    

    【讨论】:

      【解决方案4】:

      如果你像这样改变你的枚举:

      [Flags]
      public enum DayOfWeek
      {
          Sunday = 0,
          Monday = 1,
          Tuesday = 2,
          Wednesday = 3,
          Thursday = 4,
          Friday = 5,
          Saturday = 6
      }
      

      你可以试试这个:

      class Program
      {
          public static bool Equal(DayOfWeek mine, System.DayOfWeek cSharp)
          {
              int mineInt = (int)mine;
              int cSharpInt = (int)cSharp;
              return mineInt == cSharpInt;
          }
      
          static void Main(string[] args)
          {
      
              DateTime dateTime = DateTime.Now;
              DayOfWeek dayOfWeek = DayOfWeek.Sunday;
      
              bool areEqual = Equal(dayOfWeek, dateTime.DayOfWeek);
              Console.WriteLine(areEqual);
              Console.ReadKey();
          }
      }
      

      如果你不能改变你的枚举,你可以试试这个:

      class Program
      {
          public static bool Equal(DayOfWeek mine, System.DayOfWeek cSharp)
          {
              if (mine == DayOfWeek.Friday && cSharp == System.DayOfWeek.Friday       || 
                  mine == DayOfWeek.Monday && cSharp == System.DayOfWeek.Monday       || 
                  mine == DayOfWeek.Saturday && cSharp == System.DayOfWeek.Saturday   || 
                  mine == DayOfWeek.Sunday && cSharp == System.DayOfWeek.Sunday       || 
                  mine == DayOfWeek.Thursday && cSharp == System.DayOfWeek.Thursday   ||
                  mine == DayOfWeek.Tuesday && cSharp == System.DayOfWeek.Tuesday     || 
                  mine == DayOfWeek.Wednesday && cSharp == System.DayOfWeek.Wednesday)
                  return true;
      
              return false;
          }
      
          static void Main(string[] args)
          {
      
              DateTime dateTime = DateTime.Now;
              DayOfWeek dayOfWeek = DayOfWeek.Tuesday;
      
              bool areEqual = Equal(dayOfWeek, dateTime.DayOfWeek);
              Console.WriteLine(areEqual);
              Console.ReadKey();
          }
      }
      

      【讨论】:

      • 我正在使用我自己的 DayOfWeek 枚举和标志来在一个变量中组合星期几。使用标志,您需要将值设置为 2 的幂
      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2015-09-29
      相关资源
      最近更新 更多