私は次のようにDayOfWeek列挙型を繰り返し処理しています:
foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek)))
{
// Add stuff to a list
}
そして私の問題は、列挙型を日曜日ではなく月曜日までに開始したいということです。
私がやろうとした:
CultureInfo ci = Thread.CurrentThread.CurrentCulture;
ci.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Monday;
しかし、foreachループはまだ日曜日から始まりました。
これどうやってするの ?
私の最後のアイデアは、結果のリストを希望する日の順序に並べ替えることですが、それはより多くの反復を意味します。
ありがとう!
カルチャを設定しても、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());
OrderBy
を1回呼び出すだけで、必要に応じて注文できます。呼び出しの順序をEnum.GetValues
に変更することはできません。
var daysOfWeek = Enum.GetValues(typeof(DayOfWeek))
.OfType<DayOfWeek>()
.OrderBy(day => day < DayOfWeek.Monday);
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;
この列挙型が、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);
}
}
カスタム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
}
編集して追加:
実際、thatでさえ、それがそうであるように、複雑すぎます。入れてみませんか
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;
}
}
どこか、どこでも、そしてそれで終わりです! [〜#〜]キス[〜#〜] !
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
メソッドにMonday
の前にSunday
を返すように強制することはできません。