week number español day c# enums dayofweek

c# - number - ¿Para cada ciclo a través de DayOfWeek enumeración comenzar el lunes?



dayofweek sql (5)

Estoy iterando a través de DayOfWeek Enum así:

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

Y mi problema es que me gustaría que mi enumeración comenzara el lunes en lugar del domingo.

Intenté hacer:

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

Pero el bucle foreach todavía comenzó con el domingo.

Cómo puedo hacer esto ?

Mi última idea sería reordenar mi lista resultante al orden del día que quiero, pero eso significaría más iteraciones.

Gracias !


Comience con un IComparer<DayOfWeek> personalizado 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; } }

Entonces:

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

Editar para añadir:

En realidad, incluso eso es demasiado complicado, tan bonito como es. Porque no solo pones

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

En cualquier lugar, en cualquier lugar, y acaba de terminar con eso! KISS !


Eso no es posible, simplemente porque establecer la cultura no cambia el hecho de que la enum DayOfWeek se define como tal:

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

Sin embargo, puede omitir la primera entrada y agregarla más tarde ... quizás así:

foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek)) .OfType<DayOfWeek>() .ToList() .Skip(1)) { list.Add(day.ToString()); } list.Add(DayOfWeek.Sunday.ToString());


Una sola llamada a OrderBy puede ordenarlos como se desee. No es posible cambiar el orden de la llamada a Enum.GetValues .

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


Utilice un bucle for y el operador de módulo (%):

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

Si desea usar este bucle para cambiar otra enumeración, siempre puede reemplazar el número 7 con una variable inicializada como esta:

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

Incluso podría escribir un método para cambiar cualquier enumeración, suponiendo que esta enumeración tiene todos los valores entre 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); } }


Enum.GetValues devuelve elementos que están ordenados por los valores binarios de las constantes de enumeración (ver Comentarios en MSDN). DayOfWeek enumeración de DayOfWeek define de esta manera:

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

Como puede ver, el Monday define como 1 y el Sunday define como 0 . Por lo tanto, no puede forzar que el método Enum.GetValues regrese el Monday antes del Sunday .