2009-04-30 114 views
5

我有以下枚舉:簡單迭代通過整型枚舉?

Public Enum myEnum As Integer 
    first = &H1 
    second = &H2 
    third = &H4 
    fourth = &H8 
    fifth = &H10 
    sixth = &H20 
End Enum 

這裏有必要,不幸的是,該枚舉元素具有這些值,或至少具有值進行比較,可以是二進制的。

我有一個類,它可以在施工過程中設置爲兩種類型中的一種,一種類型的值與第一到第四種相關,第二種類型的值與第一到第六種有關。

我想使用一個對於遍歷枚舉的1-4或1-6個元件進行迭代,但我已經發現,這樣的代碼:

For enumType as myEnum = myEnum.first to myEnum.fourth 
Next 

遍歷{1,2,3 ,4,5,6,7,8}而不是{1,2,4,8}。
這並不理想。

很明顯,我可以對此問題進行編碼,但是我可以看到在維護編程中可以輕鬆地忽略該解決方法的場景,並且我希望有人可以推薦一個簡單的解決方案,例如,枚舉中的值必須在以後更改。

回答

3

對不起,C#:

static IEnumerable<T> EnumRange<T>(T begin, T end) 
{ 
    T[] values = (T[])Enum.GetValues(typeof(T)); 
    int beginIndex = Array.IndexOf(values, begin); 
    int endIndex = Array.IndexOf(values, end); 

    for(int i = beginIndex; i <= endIndex; ++i) 
     yield return values[i]; 
} 

foreach(MyEnum e in EnumRange(MyEnum.First, MyEnum.Fourth) 
    // Code goes here 
+0

將此標記爲對其他人的回答,因爲我對VB很苦惱*仍*缺少yield關鍵字。 – Frosty840 2009-05-01 07:41:45

1

Enum.GetValues(Type)

1

我想你會需要使用Enum.GetValues(),並篩選結果你想要什麼。例如,使用LINQ)(和使用C#,因爲我不知道VB不夠好):

(注:這裏最重要的事情是GetValues - 這應該是VB和C#)

static void Main() { 
    var qry = from MyEnum value in Enum.GetValues(typeof(MyEnum)) 
       where value >= MyEnum.First && value <= MyEnum.Fourth 
       orderby value // to sort by value; remove otherwise 
       select value; 

    foreach (var value in qry) { 
     Console.WriteLine(value); 
    } 
} 
enum MyEnum { 
    First = 0x01, 
    Second = 0x02, 
    Third = 0x04, 
    Fourth = 0x08, 
    Fifth = 0x10, 
    Sixth = 0x20 
} 
之間是相同的
2

馬克基本上是正確的,但你並不需要顯式排序(Enum.GetValues已經返回排序),你需要轉換爲輸出:

enum myEnum 
{ 
    first = 0x1, 
    second = 0x2, 
    third = 0x4, 
    fourth = 0x8, 
    fifth = 0x10, 
    sixth = 0x20, 
} 

public static void Main(string[] a) 
{ 
    var qry = from myEnum value in Enum.GetValues(typeof(myEnum)) 
     where value >= myEnum.first && value <= myEnum.fourth 
     select value; 
    foreach(var value in qry) 
    { 
     Console.WriteLine((int)value); 
    } 
} 
1

,這已經回答了,我知道,但在我看來,這已經過時了。爲什麼不這樣做?

Private Shared Sub Main() 

     Dim aryEnums As Array = [Enum].GetValues(GetType(myEnum)) 

     For i As Integer = 0 To aryEnums.GetLength(0) - 1 

      Console.WriteLine(aryEnums(i)) 

     Next 

    End Sub 
+0

這對我非常有幫助。正是我在找什麼。謝謝! – Urbycoz 2011-04-21 08:26:17