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

Я упорядочиваю ряд объектов по их свойству System.DayOfWeek.

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

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

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

Любые идеи?


person m.edmondson    schedule 03.09.2013    source источник
comment
@TimSchmelter - Извините, если я неясно выразился, это System.DayOfWeek   -  person m.edmondson    schedule 03.09.2013


Ответы (2)


Самый простой подход:

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

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

person Jon Skeet    schedule 03.09.2013
comment
это ( +1 ) или как указано в stackoverflow.com/questions/3135587/, вы можете написать собственный CurrentCulture и просто сказать, что его понедельник - person Najzero; 03.09.2013
comment
@Najzero: Да, ОП упомянул в вопросе идею пользовательской культуры. Я бы определенно посчитал это излишеством. - person Jon Skeet; 03.09.2013
comment
Отличный пример нестандартного мышления, рад, что вы согласны со мной в том, что нестандартная культура — это излишество. Кажется, работает, я просто удостоверюсь, что поместил его в метод, который описывает, почему мы используем сложение и модуль, чтобы избежать путаницы в будущем. - person m.edmondson; 03.09.2013

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

// 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 лямбда. По сути, это параметризованная версия ответа Джона выше.

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

person Tom Pažourek    schedule 10.10.2016