I am iterating through the DayOfWeek Enum like this :
foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek)))
{
// Add stuff to a list
}
And my problem is that I would like my enum to start by Monday instead of Sunday.
I tried to do :
CultureInfo ci = Thread.CurrentThread.CurrentCulture;
ci.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Monday;
But the foreach loop still started with Sunday.
How can I do this ?
My last idea would be to reorder my resulting list to the order of day I want but that would mean more iterations.
Thanks !
That isn't possible, purely because setting the culture doesn't change the fact that the DayOfWeek
enum
is defined as such:
public enum DayOfWeek {
Sunday = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6,
}
You can, however, skip the first entry and add it later.. perhaps like this:
foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek))
.OfType<DayOfWeek>()
.ToList()
.Skip(1)) {
list.Add(day.ToString());
}
list.Add(DayOfWeek.Sunday.ToString());
A single call to OrderBy
can order them as desired. It's not possible to change the order of the call to Enum.GetValues
.
var daysOfWeek = Enum.GetValues(typeof(DayOfWeek))
.OfType<DayOfWeek>()
.OrderBy(day => day < DayOfWeek.Monday);
Use a for loop and the modulo (%) operator :
DayOfWeek day;
for( int i = 0 ; i < 7 ; i++ )
{
day = (DayOfWeek) ((i + 1) % 7);
// Add stuff to a list
}
If you want to use this loop to shift another enum, you can always replace the number 7 with a variable initialized like this :
int length = Enum.GetValues(typeof(DayOfWeek)).Length;
You could even write a method to shift any enum, assuming that this enum has all the values between 0, 1, ..., n :
static IEnumerable<TEnum> Shift<TEnum>(int offset) where TEnum : struct
{
int length = Enum.GetValues(typeof(TEnum)).Length;
for( int i = 0 ; i < length ; i++ )
{
yield return (TEnum) (object) ((i + offset) % length);
}
}
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