【问题标题】:Get all set enum names from enum flags从枚举标志中获取所有设置的枚举名称
【发布时间】:2013-03-24 12:46:06
【问题描述】:

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

我想获取在_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
        }

【问题讨论】:

  • 您所陈述的目标似乎相互矛盾。您是否提供了带有相应输出的示例输入?

标签: c# enums flags


【解决方案1】:

由于您的VisibleDayOfWeekFlags 枚举,而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 枚举,而不是稍后要转换的整数。

此外,由于这会跳过反射,因此它应该更高效,并且更能抵抗值的变化(尽管我怀疑这无论如何都会发生)。

编辑:如果你想调整它们返回的顺序(比如你想从周日开始到周六),你可以很容易地改变上面行的顺序。

【讨论】:

  • 您已经清楚地认识到了问题所在。我知道 & 运算符并检查值,但希望有一个聪明的算法来用单线返回所有设置值;-) 当然,您的解决方案有效,是的,稍后如果需要,我可以将 dayofweek 值转换为它的整数.我在 UI 中的最后一项任务是用 DayOfWeek 值填充 CheckBoxList,其中索引为 0 的第一个元素当然是星期日 :) 谢谢!
  • 好吧,如果你想要一个“单线”,你可以使用这个方法(或扩展方法),你甚至可以创建一个静态查找表Dictionary&lt;VisibleDayOfWeek, DayOfWeek&gt;。希望一切顺利!
【解决方案2】:

您可以遍历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;
 }

【讨论】:

  • 如果打算转换为 DayOfWeek,这可能会导致问题,因为它从周日运行到周六,而 VisibleDayOfWeek 从周一到周日运行。
  • @ChrisSinclair - 抱歉,我错过了。如果我理解正确,我认为 modding 7 应该可以解决这个问题。 0 可以根据 OP 想要将 None 转换为 DayOfWeek 的内容来处理。
猜你喜欢
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
相关资源
最近更新 更多