【问题标题】:For each loop through DayOfWeek enum to start on Monday?对于通过 DayOfWeek 枚举的每个循环从星期一开始?
【发布时间】:2013-06-26 07:49:01
【问题描述】:

我正在像这样迭代 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 循环仍然从星期日开始。

我该怎么做?

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

谢谢!

【问题讨论】:

    标签: c# enums dayofweek


    【解决方案1】:

    这是不可能的,纯粹是因为设置文化并不会改变 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());
    

    【讨论】:

      【解决方案2】:

      只需拨打OrderBy 即可按需订购。无法将调用顺序更改为Enum.GetValues

      var daysOfWeek = Enum.GetValues(typeof(DayOfWeek))
          .OfType<DayOfWeek>()
          .OrderBy(day => day < DayOfWeek.Monday);
      

      【讨论】:

        【解决方案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);
            }
        }
        

        【讨论】:

        • 如果将 for 循环更改为 i&lt;=7day = (DayOfWeek)(i); 就足够了。
        【解决方案4】:

        从自定义IComparer&lt;DayOfWeek&gt;开始:

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

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

        【讨论】:

          【解决方案5】:

          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方法在Sunday之前返回Monday

          【讨论】:

            【解决方案6】:

            这对我有用:

            foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek))
                                  .OfType<DayOfWeek>()
                                  .ToList()
                                  .Skip(1).Union(new List<DayOfWeek> { DayOfWeek.Sunday}))
            {
                // Do stuff
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-05-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多