最优雅的方式来改变这个序列

时间:2010-04-14 13:29:41

标签: c# .net enums sequence

我将一周的日期存储在数据库表中(我无法控制),我需要在我的代码中使用它。

问题是,我想使用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;
}

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

&LT;编辑&gt;

咳咳。显然(.net反射器说)DayOfWeek从星期日开始编号为索引。

在提出愚蠢问题之前,请务必阅读文档。

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

&LT; /编辑&gt;

4 个答案:

答案 0 :(得分:5)

您想要的值是

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

使用模运算符%

答案 1 :(得分:3)

将其包裹在一个函数中:

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

}

答案 2 :(得分:0)

虽然我无法想象值会发生变化,但您应该避免假设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;
}

答案 3 :(得分:0)

您可以创建自己的枚举并将枚举直接映射到数据库中的值

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

除非您依靠DayOfWeek与日期进行实际比较,否则您必须在偏移之间进行转换。