C# 变形此序列的最优雅方式

C# 变形此序列的最优雅方式,c#,.net,enums,sequence,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 我需要它如下: 1 2 3 4 5 6 7 S M T W T F S 0 1 2 3 4 5 6 M T W

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

问题是,我想使用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
我需要它如下:

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;
}
i=dayOfWeek;
i=i-2;
if(i<0){
i=6;
}
但这有点不雅。有什么建议吗

啊哼。显然(.net reflector说)DayOfWeek从星期天开始索引为0

在提出愚蠢的问题之前,一定要阅读文档

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

将其包装在函数中:

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

   return dbDay  -2;

}
或:

将其包装在函数中:

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

   return dbDay  -2;

}
或:

你想要的价值是

(DayOfWeek)((dbDay + 5) % 7)
使用模运算符
%

所需的值为

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

使用模运算符
%

虽然我无法想象值会发生变化,但您应该真正避免假设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;
}
static DayOfWeek[]\u toDaysTable=新的DayOfWeek[]{
星期天,星期天,星期一,星期一,星期二,星期二,星期三,
星期四,星期四,星期五,星期五,星期六
};
静态DayOfWeek ToDayOfWeek(int myDayOfWeek)
{
int index=myDayOfWeek-1;
如果(索引<0 | |索引>=\u toDaysTable.Length)
抛出新ArgumentOutOfRangeException(“myDayOfWeek”);
返回(今日稳定[指数];;
}
静态int FromDayOfWeek(DayOfWeek-day)
{
int index=Array.IndexOf(_toDaysTable,day);
如果(指数<0)
抛出新ArgumentOutOfRangeException(“天”);
收益率指数+1;
}

尽管我无法想象这些值会发生变化,但您确实应该避免假设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;
}
static DayOfWeek[]\u toDaysTable=新的DayOfWeek[]{
星期天,星期天,星期一,星期一,星期二,星期二,星期三,
星期四,星期四,星期五,星期五,星期六
};
静态DayOfWeek ToDayOfWeek(int myDayOfWeek)
{
int index=myDayOfWeek-1;
如果(索引<0 | |索引>=\u toDaysTable.Length)
抛出新ArgumentOutOfRangeException(“myDayOfWeek”);
返回(今日稳定[指数];;
}
静态int FromDayOfWeek(DayOfWeek-day)
{
int index=Array.IndexOf(_toDaysTable,day);
如果(指数<0)
抛出新ArgumentOutOfRangeException(“天”);
收益率指数+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
与日期进行实际比较,否则您必须在偏移量之间进行转换。

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

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
与日期进行实际比较,否则您将不得不在偏移量之间进行转换。

@Sebastion:我自己也在想,注意到enum
DayOfWeek
可以在多个.NET语言中使用,所以只需对其进行一般性标记。哦,抱歉。我认为这门语言没有那么重要,所以我就不讲了。C#@塞巴斯蒂安:我自己也这么想,注意到enum
DayOfWeek
可以在多种.NET语言中使用,所以只是对它进行了一般性的标记。哦,对不起。我认为这门语言没有那么重要,所以我就不讲了。C#!当然了,在我的代码库中,一切都是它自己的小功能。更感兴趣的序列扭曲,必须有一个很好的数学方法来实现这一点@埃德·伍德科克——我想不出什么。最后一件事是@AakashM发布的+5%7。作为一件理所当然的事情,一切都是它在我的代码库中自己的小功能。更感兴趣的序列扭曲,必须有一个很好的数学方法来实现这一点@埃德·伍德科克——我想不出什么。最后一点是@AakashM发布的+5%7。我认为在这种情况下,假设值将保持不变是相当安全的,因为文档中有这样的说明:“……范围从零(表示DayOfWeek.Sunday)到六(表示DayOfWeek.Saday)。”我认为在这种情况下,假设这些值将保持不变是相当安全的,因为文档中有这样的说明:“……范围从零(表示星期天)到六(表示星期六)。”