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?
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With