Question

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?

Was it helpful?

Solution

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.

OTHER TIPS

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top