簡體   English   中英

修改此序列的最優雅方法

[英]Most elegant way to morph this 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;
}

但這有點不雅致。 有什么建議么?

<編輯>

顯然(.net反射器說)從星期日開始,DayOfWeek的索引為0。

在詢問愚蠢的問題之前,請務必先閱讀文檔。

但是,我仍然對答案很感興趣,只是為了滿足自己的好奇心,所以就去做。

</ EDIT>

您想要的價值是

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

使用模運算符%

將其包裝在一個函數中:

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

}

盡管我無法想象這些值會發生變化,但是您應該真正避免假設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;
}

您可以只創建自己的枚舉並將該枚舉直接映射到數據庫中的值

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與Date進行實際比較,否則必須在偏移量之間進行轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM