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