2

如何将返回枚举值转换为其整数值?

我想将_allVisibleDays枚举中设置的所有标志作为整数值获取,就像:

TuesdayWednesday设置然后我想将这些名称转换为DayOfWeek枚举以获取整数值:

所以Tuesday返回我2Wednesday 3不是下面的枚举24

我在 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不是,因此两者之间没有直接对应的翻译(例如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 回答