2

戻り列挙値を整数値にキャストするにはどうすればよいですか?

_allVisibleDays次のように、列挙型に整数値として設定されているすべてのフラグを取得したいと思います。

Tuesday設定されたら、Wednesdayこれらの名前をDayOfWeek列挙型にキャストして整数値を取得します。

したがって、以下の列挙型のとの代わりに、私をTuesday返します。2Wednesday 324

私はSOでこの方法を見つけました:

public IEnumerable<int> GetFlags()
{
   foreach (Enum value in Enum.GetValues(typeof(VisibleDayOfWeek)))
     if (_allVisibleDays.HasFlag(value))
       yield return (int) value;
}

しかし、列挙型(上記の値)を整数にキャストするという単純な例のためだけに機能させることはできません...

private VisibleDayOfWeek _allVisibleDays;


        [Flags]
        enum VisibleDayOfWeek : int
        {
            None = 0,
            Monday = 1, 
            Tuesday = 2,
            Wednesday = 4,
            Thursday = 8,
            Friday = 16,
            Saturday = 32,
            Sunday = 64
        }
4

2 に答える 2

2

yourVisibleDayOfWeekFlags列挙型であり、DayOfWeekはそうではないため、2つの間に直接対応する変換はありません(たとえば、VisibleDayOfWeek.Fridayは16、DayOfWeek.Fridayは5)。特に、これらは曜日であり、将来変更されない可能性があるため(私は願っています!)、ここでの最善の策は、チェックを使用した単純なユーティリティメソッドを作成することです。

public IEnumerable<DayOfWeek> ConvertFromVisible(VisibleDayOfWeek visibleDay)
{
    if ((visibleDay & VisibleDayOfWeek.Monday) == VisibleDayOfWeek.Monday)
        yield return DayOfWeek.Monday;

    if ((visibleDay & VisibleDayOfWeek.Tuesday) == VisibleDayOfWeek.Tuesday)
        yield return DayOfWeek.Tuesday;

    if ((visibleDay & VisibleDayOfWeek.Wednesday) == VisibleDayOfWeek.Wednesday)
        yield return DayOfWeek.Wednesday;

    if ((visibleDay & VisibleDayOfWeek.Thursday) == VisibleDayOfWeek.Thursday)
        yield return DayOfWeek.Thursday;

    if ((visibleDay & VisibleDayOfWeek.Friday) == VisibleDayOfWeek.Friday)
        yield return DayOfWeek.Friday;

    if ((visibleDay & VisibleDayOfWeek.Saturday) == VisibleDayOfWeek.Saturday)
        yield return DayOfWeek.Saturday;

    if ((visibleDay & VisibleDayOfWeek.Sunday) == VisibleDayOfWeek.Sunday)
        yield return DayOfWeek.Sunday;
}

DayOfWeekこれには、後でキャストする整数ではなく、列挙型を自動的に返すという利点があります。

さらに、これはリフレクションをスキップするため、パフォーマンスが向上し、値の変更に対する耐性も高くなるはずです(とにかくこれが発生するかどうかは疑問ですが)。

編集:返される順序を微調整したい場合(たとえば、日曜日から始めて土曜日に行きたい場合)、上記の行の順序を簡単に変更できます。

于 2013-03-24T13:05:18.857 に答える
1

配列をループしてEnumインデックスを確認できます。

public int GetEnumIndex(VisibleDayOfWeek day, bool ToBeConvertedToDoW)
{
     var allValues = Enum.GetValues(typeof(VisibleDayOfWeek));
     for (int i = 0; i <  allValues.Length ; i++)
     {
         if ((VisibleDayOfWeek)allValues.GetValue(i) == day)
         {
             //if you plan to convert to a DayOfWeek, this will return the
             //index for the DoW enum
             if(ToBeConvertedToDoW)
                return (i % 7);
             else //else return the actual index from VisibleDayOfWeek enum
                return i;
         }
     }
     return -1;
 }
于 2013-03-24T13:05:34.963 に答える