17

我正在像这样迭代 DayOfWeek 枚举:

foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek)))
{
 // Add stuff to a list 
}

我的问题是我希望我的枚举从星期一而不是星期日开始。

我试着做:

CultureInfo ci = Thread.CurrentThread.CurrentCulture;
ci.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Monday;

但是 foreach 循环仍然从星期日开始。

我怎样才能做到这一点 ?

我的最后一个想法是将我的结果列表重新排序为我想要的日期顺序,但这意味着更多的迭代。

谢谢 !

4

6 回答 6

21

这是不可能的,纯粹是因为设置文化并不会改变DayOfWeek enum定义如下的事实:

public enum DayOfWeek {
    Sunday = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6,
}

但是,您可以跳过第一个条目并稍后添加它。也许像这样:

foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek))
                              .OfType<DayOfWeek>()
                              .ToList()
                              .Skip(1)) {
    list.Add(day.ToString());
}
list.Add(DayOfWeek.Sunday.ToString());
于 2013-06-28T14:02:21.623 回答
9

一次调用就OrderBy可以根据需要订购它们。无法将调用顺序更改为Enum.GetValues.

var daysOfWeek = Enum.GetValues(typeof(DayOfWeek))
    .OfType<DayOfWeek>()
    .OrderBy(day => day < DayOfWeek.Monday);
于 2013-06-28T14:11:06.883 回答
3

使用for循环和模 (%) 运算符:

DayOfWeek day;
for( int i = 0 ; i < 7 ; i++ )
{
    day = (DayOfWeek) ((i + 1) % 7);
    // Add stuff to a list
}

如果你想使用这个循环来移动另一个枚举,你总是可以用一个像这样初始化的变量替换数字 7:

int length = Enum.GetValues(typeof(DayOfWeek)).Length;

您甚至可以编写一个方法来移动任何枚举,假设该枚举具有0、1、...、n之间的所有值:

static IEnumerable<TEnum> Shift<TEnum>(int offset) where TEnum : struct
{
    int length = Enum.GetValues(typeof(TEnum)).Length;
    for( int i = 0 ; i < length ; i++ )
    {
        yield return (TEnum) (object) ((i + offset) % length);
    }
}
于 2015-06-02T10:14:22.220 回答
1

从自定义开始IComparer<DayOfWeek>

public class DayOfWeekComparer : IComparer<DayOfWeek> {
    public int Compare(DayOfWeek x, DayOfWeek y) {
        return ModifyDayOfWeek(x).CompareTo(ModifyDayOfWeek(y));
    }

    private static int ModifyDayOfWeek(DayOfWeek x) {
        // redefine Sunday so it appears at the end of the ordering
        return x == DayOfWeek.Sunday ? 7 : (int)x;
    }
}

然后:

foreach(DayOfWeek day in Enum.GetValues(typeof(DayOfWeek))
                             .OfType<DayOfWeek>()
                             .OrderBy(x => x, new DayOfWeekComparer())) {
    // will see Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}

编辑添加:

实际上,即使那样也太复杂了,尽管它很漂亮。你为什么不把

static IEnumerable<DayOfWeek> DaysOfWeek {
    get {
        yield return DayOfWeek.Monday;
        yield return DayOfWeek.Tuesday;
        yield return DayOfWeek.Wednesday;
        yield return DayOfWeek.Thursday;
        yield return DayOfWeek.Friday;
        yield return DayOfWeek.Saturday;
        yield return DayOfWeek.Sunday;
   }
}

在某个地方,任何地方,然后就完成它!

于 2013-06-28T14:17:53.713 回答
0

Enum.GetValues返回按枚举常量的二进制值排序的元素(请参阅MSDN 上的备注)。DayOfWeek枚举是这样定义的:

public enum DayOfWeek
{
    Sunday = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3
    Thursday = 4,
    Friday = 5,
    Saturday = 6,
}

如您所见,Monday定义为1Sunday定义为0。因此,您不能强制Enum.GetValues方法返回Mondaybefore Sunday

于 2013-06-28T14:00:43.170 回答
0

这对我有用:

foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek))
                      .OfType<DayOfWeek>()
                      .ToList()
                      .Skip(1).Union(new List<DayOfWeek> { DayOfWeek.Sunday}))
{
    // Do stuff
}
于 2020-12-03T16:59:36.710 回答