2009-04-30 17 views
5

整数型の列挙型による単純な反復?私は、次の列挙型を有する

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

これは列挙要素がこれらの値を持っている、または少なくとも比べバイナリできる値を有することが、残念ながら、neccessaryです。

私は、構築中に、第1から第4までの値を持つタイプと、第1から第6までの値を持つ第2のタイプの2つのタイプのいずれかに設定できるクラスを持っています。

Iは、列挙の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}ではない。
これは理想的ではありません。

明らかに私はこの問題を回避することができますが、その回避策がメンテナンスプログラミングで簡単に見逃されるシナリオを見ることができます。たとえば、誰かが簡単な解決方法を勧めて、列挙型の値は後で変更する必要があります。 Enum.GetValues(Type)

C#のため申し訳ありません

答えて

3

+0

これは他のものよりも答えが多いと思います。なぜなら私はVBの*まだ* yieldキーワードが不足しているからです。 – Frosty840

1

ルック:

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 
1

私はあなたがEnum.GetValues()を使用し、あなたが望むものに結果をフィルタリングする必要があります期待しています。例えば、私は十分VBを知らないと、)、)LINQを使用して(とC#を使用して:

(注:ここで重要なのは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

+1

Frosty840は、特定の範囲の列挙値を反復処理します。 – Stephan