Foreach Enum

Jednym z częstszych problemów występujących w C#. Rozwiązanie jest takie oczywiste, czasem jest ono przydatne.

Jak można użyć pętli foreach na naszym typie wyliczeniowym.

Poniższy kod się nie skompiluje:

public enum GuitarString
{
    PhosphorBronze,
    Bronze8020,
    SilkandSteel,
    Nylon,
    FlatwoundStrings
}
public static void EnumerateAllGuitarString()
{
    foreach (GuitarString guitarstring in GuitarString)
    {
        Console.WriteLine(guitarstring);
    }
}

Kompilator zwróci następujący błąd

imageRozwiązanie wymaga trochę więcej kodu.

public static void EnumerateAllGuitarString()
{
    foreach (GuitarString guitarstring in
        Enum.GetValues(typeof(GuitarString)))
    {
        Console.WriteLine(guitarstring);
    }
}

Metoda “GetValues” zwraca obiekt System.Array, czyli tablicę. Jeżeli użyjesz bezpośrednio pętli foreach na tym obiekcie, to będziesz używał niegenerycznej wersji implementacji IEnumerable klasy System.Array.

Co oznacza, że każdy obiekt musi być wpakowany do typu Object, a potem z niego wypakowany. By tego uniknąć najlepiej napisać taki kod.

public static void EnumerateAllGuitarString()
{
    foreach (GuitarString guitarstring in
        (GuitarString[])Enum.GetValues(typeof(GuitarString)))
    {
        Console.WriteLine(guitarstring);
    }
}