c# - .OrderBy(DayOfWeek) para tratar el domingo como el fin de semana
.net linq (2)
Estoy ordenando un número de objetos por su propiedad System.DayOfWeek
.
System.DayOfWeek trata el domingo como el comienzo de la semana, mientras que me gustaría que se ordenara para que aparezca al final . Es solo una enumeración, así que no puedo modificarlo. Sin embargo, he leído que puedo crear una cultura personalizada, pero creo que probablemente sea una exageración.
List<TimeBand> orderedTimeBands = timeBands.OrderBy(x => x.DayName).ToList()
Así que DayName
es un DayOfWeek
, quiero que se orderedTimeBands
de tiempo ordenadas de lunes a domingo.
¿Algunas ideas?
El enfoque más simple sería:
var orderedTimeBands = timeBands.OrderBy(x => ((int) x.DayOfWeek + 6) % 7)
.ToList()
Entonces tenemos:
Name Original value Value after arithmetic
Sunday 0 6
Monday 1 0
Tuesday 2 1
Wednesday 3 2
Thursday 4 3
Friday 5 4
Saturday 6 5
... que es lo que quieres, creo.
Uso una solución basada en la cultura actual:
// all days of week
var daysOfWeek = Enum.GetValues(typeof(DayOfWeek)).Cast<DayOfWeek>();
// get first day of week from current culture
var firstDayOfWeek = CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek;
// all days of week ordered from first day of week
var daysOfWeekOrdered = daysOfWeek.OrderBy(x => (x - firstDayOfWeek + 7) % 7);
La parte importante es el OrderBy
lambda. Es básicamente una versión parametrizada de la respuesta anterior de Jon .
De esta manera, se ordenará desde el lunes en el Reino Unido y desde el domingo en los Estados Unidos.