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
.