2013-06-28 3 views
13

я итерация через DayOfWeek Enum, как это:Для каждого цикла через перечисление DayOfWeek для начала в понедельник?

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

И моя проблема в том, что я хотел бы мое перечисление начать с понедельника вместо воскресенья.

Я попытался сделать:

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

Но петля Еогеасп еще началась с воскресенья.

Как я могу это сделать?

Моей последней идеей было бы переупорядочить мой результирующий список до порядка дня, я хочу , но это будет означать больше итераций.

Спасибо!

ответ

18

Это не возможно, только потому, что установка культуры не меняет тот факт, что DayOfWeekenum определяются как таковые:

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()); 
+0

'Murica .... :-p – neural5torm

0

Enum.GetValues возвращает элементы, которые сортируются по двоичным значениям констант перечисления (см. Примечания на MSDN). DayOfWeek перечисление определяется следующим образом:

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

Как вы можете видеть, Monday определяется как 1 и Sunday определяется как 0. Таким образом, вы не можете заставить метод Enum.GetValues вернуть Monday до Sunday.

7

Один вызов OrderBy может заказать их по своему желанию. Невозможно изменить порядок звонка на Enum.GetValues.

var daysOfWeek = Enum.GetValues(typeof(DayOfWeek)) 
    .OfType<DayOfWeek>() 
    .OrderBy(day => day < DayOfWeek.Monday); 
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; 
    } 
} 

где-то, где угодно, и просто с этим нужно! KISS!

1

Используйте для цикла и по модулю (%) оператора:

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, ..., п:

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