代码之家  ›  专栏  ›  技术社区  ›  Ed James

最优雅的方式变形这个序列

  •  1
  • Ed James  · 技术社区  · 16 年前

    我已经将一周中的某一天存储在一个数据库表中(我不控制它),我需要在代码中使用它。

    问题是,我想用System.DayOfWeek枚举来表示这个,但是序列不一样。

    1  2  3  4  5  6  7
    S  M  T  W  T  F  S
    

    0  1  2  3  4  5  6
    M  T  W  T  F  S  S
    

    最优雅的方法是什么?

    例如,我可以:

    i = dayOfWeek;
    i = i - 2;
    if (i < 0) {
        i = 6;
    }
    

    但这有点不雅。有什么建议吗?

    <编辑>

    啊哼。显然(.net reflector说)DayOfWeek从周日开始索引为0。

    在问愚蠢的问题之前,一定要先看一下文件。

    然而,我仍然对答案感兴趣,只是为了满足我自己的好奇心,所以去吧。

    </编辑>

    4 回复  |  直到 16 年前
        1
  •  5
  •   AakashM    16 年前

    你想要的价值是

    (DayOfWeek)((dbDay + 5) % 7)
    

    %

        2
  •  3
  •   Oded    16 年前

    将其包装到函数中:

    public int DbToDayOfWeek(int dbDay)
    {
       if (dbDay == 1)
         return 6;
    
       return dbDay  -2;
    
    }
    

    public DayOfWeek DbToDayOfWeek(int dbDay)
    {
       if (dbDay == 1)
         return DayOfWeek.Sunday;
    
       return (DayOfWeek)(dbDay - 2);
    
    }
    
        3
  •  0
  •   plinth    16 年前

    尽管我无法想象这些值会发生变化,但您应该避免假设DayOfWeek枚举的值将保持不变,因此相应地编写代码。

    static DayOfWeek[] _toDaysTable = new DayOfWeek[] {
        DayOfWeek.Sunday, DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday,
        DayOfWeek.Thursday, DayOfWeek.Friday, DayOfWeek.Saturday
    };
    
    static DayOfWeek ToDayOfWeek(int myDayOfWeek)
    {
         int index = myDayOfWeek - 1;
         if (index < 0 || index >= _toDaysTable.Length)
              throw new ArgumentOutOfRangeException("myDayOfWeek");
         return _toDaysTable[index];
    }
    
    static int FromDayOfWeek(DayOfWeek day)
    {
        int index = Array.IndexOf(_toDaysTable, day);
        if (index < 0)
            throw new ArgumentOutOfRangeException("day");
        return index + 1;
    }
    
        4
  •  0
  •   James    16 年前

    public enum DayOfWeek
    {
        Mon = 2,
        Tue = 3,
        Wed = 4,
        Thu = 5,
        Fri = 6,
        Sat = 7,
        Sun = 1
    }
    

    然后你可以使用你的 DayOfWeek 键入以检索值:

    public static int ToInt(this DayOfWeek dow)
    {
        return (int)dow;   
    }
    

    除非你依靠 星期一 对于与日期的实际比较,否则必须在偏移量之间进行转换。

    推荐文章