.OrderBy(DayOfWeek) за третиране на неделята като край на седмицата

Подреждам редица обекти по тяхното System.DayOfWeek свойство.

DayOfWeek третира неделята като начало на седмицата, докато Бих искал да бъде поръчан, така че да се появи в края. Това е просто enum, така че не мога да го променя. Въпреки това прочетох, че може да успея да създам персонализирана култура но мисля, че това вероятно е прекалено.

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