.OrderBy(DayOfWeek), чтобы лечить воскресенье как конец недели

Я заказываю несколько объектов по свойству System.DayOfWeek.

DayOfWeek рассматривает воскресенье как начало недели, тогда как я бы хотел, чтобы он был заказан, чтобы он появился в конце. Это просто перечисление, поэтому я не могу его изменить. Однако я читал, что я могу создать настраиваемую культуру, но думаю, что это, вероятно, слишком велико.

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

Итак DayName - это DayOfWeek, я хочу, чтобы orderedTimeBands заказывался с понедельника → воскресенье.

Любые идеи?

Ответ 1

Самый простой способ:

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

Итак, мы имеем:

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

... это то, что вы хотите, я думаю.

Ответ 2

Я использую решение, основанное на текущей культуре:

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

Важной частью является OrderBy лямбда. Это в основном параметризованная версия Jon answer выше.

Таким образом, он будет заказан с понедельника в Великобритании и с воскресенья в США.