Wednesday, 10 August 2005

Sicher kam der eine oder andere Programmierer schon einmal in die Situation durch ein Enum zu iterieren, um die Werte einfach nur irgendwo in der richtigen Reihenfolge anzuzeigen. Zum Beispiel:
     enum MyEnum{Montag, Dienstag, Mittwoch, Donnerstag, Freitag};

Nichts leichter als das, da gibt es ja die verschiedensten Möglichkeiten, z.B.:

A) Umständlich

     foreach (int item in MyEnum.GetValues(typeof(MyEnum))){
          MyEnum myEnum = (MyEnum)item;
          Console.WriteLine(myEnum + "," );
     }

bzw.
     foreach (object item in Enum.GetValues(typeof(MyEnum)))
          Console.WriteLine(item);


B) Lesbar

     for
(MyEnum day=MyEnum.Montag; day<=MyEnum.Freitag; day++)
            Console.WriteLine(day);


oder C) über die Enum.GetNames() Methode

     foreach (string item in Enum.GetNames(typeof(MyEnum)))
            Console.WriteLine(item + "," );

Gut und schön, das alles funktioniert leider nur solange korrekt, bis man den Werten eigene Integerwerte zuweist. Gerade Methode B) ist sehr anfällig auf Wert-Veränderungen.

Bereits bei einer kleinen Änderungen wie:
   enum MyEnum{Montag=-2, Dienstag, Mittwoch, Donnerstag, Freitag=-4};

liefert Methode B) aufgrund der angegebenen Bedingung nichts mehr zurück.
A) und C) sind da ein klein wenig resistenter und erzeugen folgenden sinnfreien Output: "Mittwoch, Donnerstag, Freitag, Montag, Dienstag"


Ok, noch ein Schritt weiter:
   enum MyEnum{Montag=0, Dienstag=-1, Mittwoch=4, Donnerstag=-2, Freitag};

Methode B) liefert auch hier nichts zurück.
Methode A) ergibt  "Montag, Mittwoch, Donnerstag, Dienstag, Dienstag"
Aber wo ist der Freitag?? Hier trennt sich die Spreu vom Weizen.
Lediglich Methode C) war so fair und hat sich den Freitag nicht einbehalten: -->
"Montag, Mittwoch, Donnerstag, Dienstag, Freitag", die Reihenfolge ist dennoch nicht erwünscht.

Ein letzter Versuch, am Freitag kommt noch eine 1 ran:
enum MyEnum{Montag=0, Dienstag=-1, Mittwoch=4, Donnerstag=-2, Freitag=1};

Methode B) zeigt nun wenigstens den Wochenstart: "Montag" und schluckt den Rest. A) und C) sind sich auch wieder einig mit "Montag, Freitag, Mittwoch, Donnerstag, Dienstag"


Nun gut, wer es bis hier her geschafft hat, bekommt nun ein Wissenbonus ;-)
Denn es gibt eine Möglichkeit die richtige Reihenfolge darzustellen. Und zwar mit Hilfe von Reflections, was so aussieht:

     Type type = typeof(MyEnum);
     System.Reflection.FieldInfo[] fis = type.GetFields();
     foreach(System.Reflection.FieldInfo fi in fis){
          if(fi.IsStatic)
               Console.WriteLine(fi.Name + "," );
     }

Ist  nicht wirklich lesbarer, aber funktioniert zumindest in allen obigen Fällen korrekt.

that's all folks

Wednesday, 10 August 2005 00:51:07 (GMT Daylight Time, UTC+01:00)  #    Comments [21]  | 

Theme design by Jelle Druyts

Pick a theme: