问题
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?
回答1:
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.
回答2:
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.
来源:https://stackoverflow.com/questions/18591039/orderbydayofweek-to-treat-sunday-as-the-end-of-the-week