Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

.OrderBy(DayOfWeek) to treat Sunday as the end of the week

Tags:

I'm ordering a number of objects by their System.DayOfWeek property.

DayOfWeek treats Sunday as the start of the week, whereas I would like it to be ordered so it appears at the end. It's just an enum, so I can't modify it. However I've read that I may be able to create a custom culture but think this is probably overkill.

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

So DayName is a DayOfWeek, i want orderedTimeBands to be ordered from Monday -> Sunday.

Any ideas?

like image 805
m.edmondson Avatar asked Sep 03 '13 11:09

m.edmondson


2 Answers

The simplest approach would be:

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

So we have:

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 

... which is what you want, I think.

like image 182
Jon Skeet Avatar answered Nov 09 '22 20:11

Jon Skeet


I use a solution based on current culture:

// 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); 

The important part is the OrderBy lambda. It's basically a parametrized version of Jon's answer above.

This way it will be ordered from Monday in the UK, and from Sunday in the US.

like image 40
Tom Pažourek Avatar answered Nov 09 '22 22:11

Tom Pažourek