【问题标题】:DayOfWeek get the next DayOfWeek(Monday,Tuesday...Sunday)DayOfWeek 获取下一个 DayOfWeek(Monday,Tuesday...Sunday)
【发布时间】:2016-05-10 01:21:51
【问题描述】:

有没有办法把这段代码总结成1-2行?

我的目标是返回,例如,我有一个 DayOfWeek 是星期一,我想得到之后的第二天(星期二)或之后的 n 天。

         switch (_RESETDAY)
        {
            case DayOfWeek.Monday:
                _STARTDAY = DayOfWeek.Tuesday;
                break;
            case DayOfWeek.Tuesday:
                _STARTDAY = DayOfWeek.Wednesday;
                break;
            case DayOfWeek.Wednesday:
                _STARTDAY = DayOfWeek.Thursday;
                break;
            case DayOfWeek.Thursday:
                _STARTDAY = DayOfWeek.Friday;
                break;
            case DayOfWeek.Friday:
                _STARTDAY = DayOfWeek.Saturday;
                break;
            case DayOfWeek.Saturday:
                _STARTDAY = DayOfWeek.Sunday;
                break;
            case DayOfWeek.Sunday:
                _STARTDAY = DayOfWeek.Monday;
                break;
            default:
                _STARTDAY = DayOfWeek.Tuesday;
                break;
        }

【问题讨论】:

    标签: c# dayofweek


    【解决方案1】:

    这只是一个 int 枚举,范围从星期日 (0) 到星期六 (6),根据 MSDN:

    DayOfWeek 枚举表示每周有 7 天的日历中的星期几。此枚举中常量的值范围从 DayOfWeek.Sunday 到 DayOfWeek.Saturday。如果转换为整数,则其值范围从零(表示 DayOfWeek.Sunday)到六(表示 DayOfWeek.Saturday)。

    这么简单的数学就应该做到:

    DayOfWeek nextDay = (DayOfWeek)(((int)_RESETDAY + 1) % 7);
    

    如果需要,请将 + 1 替换为 + n

    【讨论】:

    • 这是最好的。它解释了从周六到​​周日的切换
    【解决方案2】:

    是的。

    (DayOfWeek)((int)(_RESETDAY+1)%7)
    

    【讨论】:

      【解决方案3】:

      结果与上面回答的加法和模数相同,但更易读恕我直言:

      day = (day == DayOfWeek.Saturday) ? DayOfWeek.Sunday : day + 1;
      

      明显的代码意图总是更令人愉快。

      【讨论】:

        【解决方案4】:
            static DayOfWeek dayplus (DayOfWeek day)
            {
                if (day == DayOfWeek.Saturday)
                    return DayOfWeek.Sunday;
                else
                    return day + 1;
            }
        

        例如

        Console.WriteLine(dayplus(DayOfWeek.Sunday));
        

        星期一回来

        【讨论】:

        • 是的,我注意到星期六的问题,因为这里的一周从星期一开始,但我编辑了
        【解决方案5】:

        一般情况解决方案使用模运算

          DayOfWeek _RESETDAY = ...;
          int shift = 1; // can be positive or negative
        
          // + 7) % 7 to support negative shift´s
          DayOfWeek result = (DayOfWeek) ((((int)_RESETDAY + shift) % 7 + 7) % 7);
        

        可能最好的实现是隐藏扩展方法中的繁琐公式:

         public static class DayOfWeekExtensions {
           public static DayOfWeekShift(this DayOfWeek value, int shift) {
             return (DayOfWeek) ((((int)value + shift) % 7 + 7) % 7);
           }
         }
        
         ...
        
         var result = _RESETDAY.Shift(1);
        

        并略有减少(仅在负偏移不低于 -7 的情况下适用于所有情况):

             return (DayOfWeek)(((int)value + shift + 7) % 7);
        

        【讨论】:

        • @Ian Newson: 当shift < 0 然后%7 可以返回一个负值 - 所以+7(和第二个% 7)应该被添加跨度>
        猜你喜欢
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        • 1970-01-01
        • 2021-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-04
        相关资源
        最近更新 更多