2009-04-30 18 views
5

I tienen la siguiente Enum:iteración simple a través de una enumeración de tipo entero

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

Es neccessary, por desgracia, que los elementos de enumeración tienen esos valores, o al menos tener valores que pueden ser binario comparación.

Tengo una clase que se puede configurar durante la construcción para que sea de uno de dos tipos, un tipo con valores relacionados del primero al cuarto, y un segundo tipo con valores relacionados del primero al sexto.

me gustaría utilizar un bucle for para iterar a través de 1-4 o 1-6 elementos de la enumeración, pero he encontrado que este código:

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

itera a través de {1,2,3 , 4,5,6,7,8} y no a través de {1,2,4,8}.
Esto no es ideal.

Obviamente pueden solucionar este problema, pero puedo ver un escenario en el que la solución podría ser fácilmente se perdió en la programación de mantenimiento, y yo estoy esperando que alguien puede recomendar una solución sencilla que no se rompa si, por ejemplo, los valores en la enumeración tienen que cambiar en una fecha posterior.

Respuesta

3

Lo sentimos para 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

Marcó esta como la respuesta sobre las demás porque estoy resentido con VB * todavía * sin la palabra clave yield. – Frosty840

1

Mira Enum.GetValues(Type)

1

espero que necesita para utilizar Enum.GetValues(), y filtrar los resultados de lo que desea. Por ejemplo, el uso de LINQ) (y usando C#, ya que no sé VB lo suficientemente bien):

(nota: lo importante aquí es la GetValues - que debe ser idéntico entre VB y 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

Marc es básicamente correcto, excepto que no es necesario explícitamente especie (Enum.GetValues ​​ya vuelve ordenada), y tiene que emitir en favor de la producción:

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

sé que esto ya ha sido contestada , pero me parece que esto ha sido más de pensamiento. ¿Por qué no hacer esto?

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

Esto fue extremadamente útil para mí. Exactamente lo que estaba buscando. ¡Gracias! – Urbycoz

+1

Frosty840 quiere iterar sobre un rango específico de los valores enum. – Stephan

Cuestiones relacionadas