代码之家  ›  专栏  ›  技术社区  ›  balexandre

位标记-我缺少什么?

  •  6
  • balexandre  · 技术社区  · 14 年前

    一个简单的代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        DateTime now = DateTime.UtcNow;
    
        lit.Text += "<br/>now.DayOfWeek: " + now.DayOfWeek.ToString();
    
        // weekdays (Saturday is not included)
        DayOfWeek runningDays = DayOfWeek.Monday | DayOfWeek.Tuesday | DayOfWeek.Wednesday | DayOfWeek.Thursday | DayOfWeek.Friday;
    
        lit.Text += "<br/>" + runningDays.HasFlag(now.DayOfWeek);
        lit.Text += "<br/>" + runningDays.HasAny(now.DayOfWeek);
        lit.Text += "<br/>" + ((runningDays & now.DayOfWeek) != 0);
    
        // weekend (Saturday is in a weekend)
        runningDays = DayOfWeek.Saturday | DayOfWeek.Sunday;
    
        lit.Text += "<br/>" + runningDays.HasFlag(now.DayOfWeek);
        lit.Text += "<br/>" + runningDays.HasAny(now.DayOfWeek);
        lit.Text += "<br/>" + ((runningDays & now.DayOfWeek) != 0);
    }
    

    帮手:

    public static bool HasExactly(this DayOfWeek x, DayOfWeek y) { return x == y; }
    public static bool HasAny(this DayOfWeek x, DayOfWeek y) { return 0 != (x & y); }
    public static bool HasAll(this DayOfWeek x, DayOfWeek y) { return y == (x & y); }
    

    今日产量(周六)

    now.DayOfWeek: Saturday
    True
    True
    True
    True
    True
    True 
    

    但是输出应该是这样的:

    now.DayOfWeek: Saturday
    False
    False
    False
    True
    True
    True 
    

    我这里缺什么?

    5 回复  |  直到 13 年前
        1
  •  12
  •   Yakimych    14 年前

    一周中的几天不是小旗。 http://msdn.microsoft.com/en-us/library/system.datetime.dayofweek.aspx

    中常量的值 DayOfWeek枚举的范围为 星期几。星期日到 星期几。星期六。如果铸造成 整数,其值范围为零 (表示dayofweek.sunday)至 六(表示 星期几,星期六)。

        2
  •  7
  •   Ales Potocnik Hahonina    13 年前

    我知道这是一篇旧的文章,但以防万一——做标记枚举的一个简洁语法是

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

    您将需要“无”来指示未选择任何内容。这样的枚举允许您指示多天,例如:

    var selectedDays = DaysOfWeek.Tuesday | DaysOfWeek.Friday;
    

    希望不需要评论。为了“解码”该值:

    public bool IsDayOfWeekSelected(DaysOfWeek which, DaysOfWeek selection)
    {
        return selection & which == which;
    }
    

    然后我们可以打电话给:

    var isTuesday = IsDayOfWeekSelected(DaysOfWeek.Tuesday, selectedDays); // => true
    var isWednesday = IsDayOfWeekSelected(DaysOfWeek.Wednesday, selectedDays); // => false
    var isFriday = IsDayOfWeekSelected(DaysOfWeek.Friday, selectedDays); // => true
    

    希望这能帮助别人。

        3
  •  2
  •   Ray    14 年前

    如果需要像标记一样使用DayOfWeek枚举,则可以创建自己的DayOfWeek枚举:

    [Flags]
    public enum MyDayOfWeek { Sunday = 1, Monday = 2, Tuesday = 4, ... , Saturday = 64 };
    
        4
  •  1
  •   Albin Sunnanbo    14 年前

    DayOfWeek有序列号。

    使用A List<DayOfWeek> .

    转到定义显示:

    // Summary:
    //     Specifies the day of the week.
    [Serializable]
    [ComVisible(true)]
    public enum DayOfWeek
    {
        // Summary:
        //     Indicates Sunday.
        Sunday = 0,
        //
        // Summary:
        //     Indicates Monday.
        Monday = 1,
        //
        // Summary:
        //     Indicates Tuesday.
        Tuesday = 2,
        //
        // Summary:
        //     Indicates Wednesday.
        Wednesday = 3,
        //
        // Summary:
        //     Indicates Thursday.
        Thursday = 4,
        //
        // Summary:
        //     Indicates Friday.
        Friday = 5,
        //
        // Summary:
        //     Indicates Saturday.
        Saturday = 6,
    }
    
        5
  •  0
  •   dan04    14 年前

    这个 DayOfWeek 枚举的目的是表示一周中的一天,而不是一组天。

    使用时不会出现编译器错误 & 因为枚举是整数,但运算符不执行您期望的操作(除非您碰巧只在周一、周二或周四安排事件)。

    如果您想要一个位标志,那么声明一个位标志类型,就像Ray建议的那样。