17

私はこのように DayOfWeek Enum を繰り返し処理しています:

foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek)))
{
 // Add stuff to a list 
}

そして私の問題は、列挙型を日曜日ではなく月曜日に開始したいということです。

私はやろうとしました:

CultureInfo ci = Thread.CurrentThread.CurrentCulture;
ci.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Monday;

しかし、foreach ループはまだ日曜日から始まりました。

これどうやってするの ?

私の最後のアイデアは、結果のリストを希望する日の順序に並べ替えることですが、それはより多くの反復を意味します。

ありがとう !

4

6 に答える 6

21

DayOfWeek enum純粋に、カルチャを設定してもが次のように定義されているという事実が変わらないため、これは不可能です。

public enum DayOfWeek {
    Sunday = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6,
}

ただし、最初のエントリをスキップして後で追加することもできます。おそらく次のようにします。

foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek))
                              .OfType<DayOfWeek>()
                              .ToList()
                              .Skip(1)) {
    list.Add(day.ToString());
}
list.Add(DayOfWeek.Sunday.ToString());
于 2013-06-28T14:02:21.623 に答える
9

に電話するOrderByだけで、必要に応じて注文できます。への呼び出しの順序を変更することはできませんEnum.GetValues

var daysOfWeek = Enum.GetValues(typeof(DayOfWeek))
    .OfType<DayOfWeek>()
    .OrderBy(day => day < DayOfWeek.Monday);
于 2013-06-28T14:11:06.883 に答える
3

forループとモジュロ (%) 演算子を使用します。

DayOfWeek day;
for( int i = 0 ; i < 7 ; i++ )
{
    day = (DayOfWeek) ((i + 1) % 7);
    // Add stuff to a list
}

このループを使用して別の列挙型をシフトしたい場合は、常に数値 7 を次のように初期化された変数に置き換えることができます。

int length = Enum.GetValues(typeof(DayOfWeek)).Length;

この列挙型が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);
    }
}
于 2015-06-02T10:14:22.220 に答える
1

カスタムから始めますIComparer<DayOfWeek>:

public class DayOfWeekComparer : IComparer<DayOfWeek> {
    public int Compare(DayOfWeek x, DayOfWeek y) {
        return ModifyDayOfWeek(x).CompareTo(ModifyDayOfWeek(y));
    }

    private static int ModifyDayOfWeek(DayOfWeek x) {
        // redefine Sunday so it appears at the end of the ordering
        return x == DayOfWeek.Sunday ? 7 : (int)x;
    }
}

それで:

foreach(DayOfWeek day in Enum.GetValues(typeof(DayOfWeek))
                             .OfType<DayOfWeek>()
                             .OrderBy(x => x, new DayOfWeekComparer())) {
    // will see Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}

編集して追加:

実際には、それでさえ複雑すぎます。入れてみませんか?

static IEnumerable<DayOfWeek> DaysOfWeek {
    get {
        yield return DayOfWeek.Monday;
        yield return DayOfWeek.Tuesday;
        yield return DayOfWeek.Wednesday;
        yield return DayOfWeek.Thursday;
        yield return DayOfWeek.Friday;
        yield return DayOfWeek.Saturday;
        yield return DayOfWeek.Sunday;
   }
}

どこでも、どこでも、それで終わりです!キス

于 2013-06-28T14:17:53.713 に答える
0

Enum.GetValuesは、列挙定数のバイナリ値で並べ替えられた要素を返します ( MSDNの備考を参照)。DayOfWeekこのように定義された列挙:

public enum DayOfWeek
{
    Sunday = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3
    Thursday = 4,
    Friday = 5,
    Saturday = 6,
}

ご覧のとおり、Mondayとして定義され1、としてSunday定義されてい0ます。したがって、メソッドが の前Enum.GetValuesに戻るように強制することはできません。MondaySunday

于 2013-06-28T14:00:43.170 に答える