2013-03-24 167 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