2013-06-28 11 views
13

jestem iteracja w DAYOFWEEK Enum takich jak to:Dla każdej pętli poprzez enum DayOfWeek, które rozpocznie się w poniedziałek?

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

A moim problemem jest to, że chciałbym, aby mój enum zacząć od poniedziałku zamiast niedzieli.

próbowałem zrobić:

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

Ale pętla foreach jeszcze rozpoczął się w niedzielę.

Jak mogę to zrobić?

Moim ostatnim pomysłem jest zmiana kolejności otrzymanych list na kolejność dnia, w którym chcę , ale oznaczałoby to więcej powtórzeń.

Dzięki!

Odpowiedz

18

To nie jest możliwe, ponieważ ustawienie czysto kultury nie zmienia faktu, że DayOfWeekenum jest zdefiniowany jako takie:

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

Można jednak pominąć pierwszy wpis i dodać go później .. może słuszne:

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 zwraca elementy posortowane według binarnych wartości stałych wyliczeniowych (patrz Uwagi w witrynie MSDN). DayOfWeek wyliczenie zdefiniowana w ten sposób:

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

Jak widać, Monday zdefiniowany jako 1 i Sunday zdefiniowany jako 0. Tak więc nie można wymusić metody Enum.GetValues zwrócenia Monday przed Sunday.

7

pojedyncza wywołanie OrderBy można zamówić je w razie potrzeby. Nie można zmienić kolejności połączenia na Enum.GetValues.

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

start ze zwyczajem 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; 
    } 
} 

wówczas:

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

Edycja dodać:

Właściwie nawet że jest zbyt skomplikowany, tak ładna, jak to jest. Dlaczego po prostu nie wstawiasz gdzieś, gdziekolwiek i po prostu to robisz! KISS!

1

Użyj dla pętli i modulo (%) Operator:

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

Jeśli chcesz korzystać z tej pętli przesunięcie kolejnego wyliczenia, zawsze można wymienić numer 7 o zmiennej zainicjowany tak :

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

można nawet napisać metodę przesunąć dowolny enum, zakładając, że ten enum ma wszystkie wartości pomiędzy 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); 
    } 
} 
Powiązane problemy