2013-03-24 125 views
2

如何将返回枚举值转换为其整数值?获取枚举标志的所有枚举名称

我想这是在_allVisibleDays枚举设置为整数值就像所有的标志:

TuesdayWednesday设置,则我想这些名字铸造成一个DayOfWeek枚举以获得整数值:

所以Tuesday返回我2Wednesday3代替2及以下枚举的4

我发现这个方法对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 
     } 
+2

你陈述的目标出现矛盾。 Cna你提供了一个样本输入及其相应的输出? – 2013-03-24 12:49:14

回答

2

由于您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; 
} 

这样做的好处自动返回枚举类型,而不是稍后投入的整数。

此外,由于这种跳过反思,应该是更好的性能以及对价值变动更耐(虽然我怀疑这会发生无论如何)。

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

+0

你已经清楚地认识到了这个问题。我知道&操作符并检查值,但希望有一个聪明的algorythm返回所有设置值与一个班轮;-)当然你的解决方案的作品,是的后来如果需要我可以将dayofweek值转换为其整数。我在UI中的最后一项任务是使用那些DayOfWeek值填充CheckBoxList,其中索引0的第一个元素当然是星期天:)谢谢! – Elisabeth 2013-03-24 14:09:28

+0

那么如果你想有一个“一衬里”,你可以用这个方法(或扩展方法),你甚至可以创建一个静态查找表'词典'。希望这一切都可以实现! – 2013-03-24 14:16:04

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; 
} 
+0

如果打算转换为[DAYOFWEEK](http://msdn.microsoft.com/en-ca/library/system.dayofweek%28v=vs.110%29.aspx),这可能是它从运行造成问题周日到周六,而“VisibleDayOfWeek”从周一到周日。 – 2013-03-24 13:09:00

+1

@ChrisSinclair - 对不起,我错过了。我认为如果我理解正确,mod7应该解决这个问题。可以根据OP想要将None转换为DayOfWeek来处理'0'。 – keyboardP 2013-03-24 13:15:18