2013-09-03 9 views
12

Sto ordinando un numero di oggetti dalla loro proprietà System.DayOfWeek..OrderBy (DayOfWeek) da trattare domenica come fine della settimana

DayOfWeek considera la domenica come il iniziare della settimana, mentre io vorrei per essere ordinato in modo che appare alla fine . È solo un enum, quindi non posso modificarlo. Tuttavia ho letto che potrei essere in grado di creare un custom culture ma penso che questo sia probabilmente eccessivo.

List<TimeBand> orderedTimeBands = timeBands.OrderBy(x => x.DayName).ToList()

Così DayName è un DayOfWeek, voglio orderedTimeBands da ordinare dal Lunedi -> Domenica.

Qualche idea?

+0

@TimSchmelter - Scusa se non ero chiaro, è un 'System.DayOfWeek' –

risposta

28

L'approccio più semplice potrebbe essere:

var orderedTimeBands = timeBands.OrderBy(x => ((int) x.DayOfWeek + 6) % 7) 
           .ToList() 

Quindi abbiamo:

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 

... che è quello che si vuole, credo.

+0

questo (+1) o come indicato in http://stackoverflow.com/questions/3135587/c-set-initial- dayofweek-as-monday-not-Sunday potresti scrivere una CurrentCulture "personalizzata" e dirci semplicemente che è lunedì – Najzero

+0

@Najzero: Sì, l'OP ha menzionato l'idea della cultura personalizzata nella domanda. Lo considererei sicuramente eccessivo. –

+0

Un grande esempio di pensare fuori dagli schemi, felice che tu sia d'accordo con me sul fatto che una cultura personalizzata sia eccessiva. Sembra funzionare, farò in modo di inserirli in un metodo che descriva il motivo per cui stiamo usando l'aggiunta e il modulo per salvare la confusione futura. –

2

Io uso una soluzione basata sulla cultura attuale:

// 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 è il OrderBy lambda. È fondamentalmente una versione parametrizzata di Jon's answer superiore a.

In questo modo sarà ordinato da lunedì nel Regno Unito e da domenica negli Stati Uniti.

Problemi correlati