Wie erkläre ich eine enum in C#?
Wie können Sie aufzählen, eine enum
in C#?
E. g. der folgende code nicht kompilieren:
public enum Suit
{
Spades,
Hearts,
Clubs,
Diamonds
}
public void EnumerateAllSuitsDemoMethod()
{
foreach (Suit suit in Suit)
{
DoSomething(suit);
}
}
Und gibt die folgenden compile-time Fehlermeldung:
'Anzug' ist ein 'Typ', wird aber verwendet wie eine 'variable'
Es scheitert an der Suit
Schlüsselwort, das zweite.
- Siehe auch ... stackoverflow.com/questions/972307/...
- Sie können prüfen wollen, die ins und outs der C# - enums, die wird dieses, sowie andere nützliche enum-Leckerbissen
- LOL hatte GENAU die gleiche Frage (denke, Sie wollen sth mit poker?) 😀
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinweis: Der cast zu
(Suit[])
ist nicht unbedingt notwendig, aber macht den code 0,5 ns schneller.enum.GetValues
. Sie haben zu verwenden, was in diesem Fall.enum E {A = 0, B = 0}
.Enum.GetValues
Ergebnisse in zwei Werten zurückgegeben wird, obwohl Sie identisch sind.E.A == E.B
ist wahr, es gibt also keine Unterscheidung. Wenn Sie möchten, dass einzelne Namen, dann sollten Sie sich fürEnum.GetNames
.Distinct
Erweiterung (seit .NET 3.5), soforeach (var suit in ((Suit[])Enum.GetValues(typeof(Suit))).Distinct()) { }
.var
für den Typ. Der compiler wird die variable eineObject
statt der enum. Liste der enum-Typ explizit.(Suit[])
mein code ausgeführt 1,6 mal schneller. Versuchen Sie es selbst. Getestet habe ich eine leere foreach-mit Stoppuhr.for (int i = 0; i < 1000000; i++) foreach (Suit suit in (Suit[])Enum.GetValues(typeof(Suit))) {}
Sieht es für mich wie Sie wirklich wollen, drucken Sie die Namen der einzelnen enum, anstatt die Werte. In dem Fall
Enum.GetNames()
scheint der richtige Ansatz.Durch die Art und Weise, hochzählen ist nicht ein guter Weg, um auflisten der Werte von enum. Sie sollten dies tun, statt.
Ich würde
Enum.GetValues(typeof(Suit))
statt.Enum.GetValues(typeof(Suits)).OfType<Suits>().ToArray()
. In diesem Fall kann ich das array iterieren vonSuits
enum-Elemente, keine Zeichenfolgen.Ich habe einige Erweiterungen für die einfache enum-Nutzung, vielleicht kann jemand es verwenden...
Den enum selbst muss eingerichtet werden mit dem "FlagsAttribute"
where T: Enum
Einige Versionen von der .NET framework nicht unterstützen
Enum.GetValues
. Hier ist ein guter workaround von Ideen 2.0: Enum.GetValues im Compact Framework:Als mit code, der beinhaltet Reflexion, sollten Sie Maßnahmen ergreifen, um sicherzustellen, es läuft nur einmal und die Ergebnisse werden zwischengespeichert.
return type.GetFields().Where(x => x.IsLiteral).Select(x => x.GetValue(null)).Cast<Enum>();
Warum ist niemand mit
Cast<T>
?Dort gehen Sie
IEnumerable<Suit>
.from
- Klausel und dieforeach
header Feststellung.Ich denke, das ist effizienter als andere Vorschläge, weil
GetValues()
ist nicht jedes mal aufgerufen, wenn Sie eine Schleife. Es ist auch übersichtlicher. Und Sie erhalten einen Laufzeitfehler, nicht um eine Laufzeit-exception, wennSuit
ist nicht einenum
.EnumLoop
hat diese ganz Allgemeine definition:EnumLoop
mit einigen Typen, die nicht eine enum, es wird kompilieren in Ordnung, aber werfen einer exception zur Laufzeit.where Key: Enum
Wirst du nicht bekommen
Enum.GetValues()
in Silverlight.Original Blog-Post von Einar Ingebrigtsen:
where T: Enum
Nur meine Lösung, die funktioniert im compact framework (3.5) und unterstützt die Typ-Prüfung zur compile-Zeit:
- Wenn jemand weiß, wie, um loszuwerden, das
T valueType = new T()
ich würde gerne sehen, eine Lösung.Einen Aufruf würde wie folgt Aussehen:
T valueType = default(T)
?new()
T
. Auch brauchen Sie nichtnew T()
überhaupt, können Sie nur die statischen Felder allein und tun.GetValue(null)
. Siehe Aubrey Antwort.where T: Enum
Ich denke, dass Sie verwenden können,
Ich denke, das Zwischenspeichern der array-Geschwindigkeit würde er sich erheblich. Es sieht aus wie Sie ' re immer ein neues array (durch Reflexion) zu jeder Zeit. Eher:
Zumindest ein wenig schneller, ja?
Drei Möglichkeiten:
Nicht sicher, warum war
GetEnumValues
eingeführt, Typ-Instanz, es ist nicht sehr gut lesbar in allen für mich.Dass eine helper-Klasse wie
Enum<T>
ist, was die meisten lesbar und unvergesslich für mich:Nun rufen Sie:
Kann man auch eine Art Zwischenspeicherung, wenn es um performance geht, aber ich erwarte nicht, dass dies ein Problem überhaupt
Was die Hölle ich werde werfen meine zwei Cent in, nur durch die Kombination der top-Antworten, die ich durch zusammen eine sehr einfache Erweiterung
Sauber, einfach und von @Jeppe-Stig-Nielsen s Kommentar schnell.
where T: Enum
Ich ToString() verwenden, dann splitten und Parsen der spit-array in den flags.
Gibt es zwei Möglichkeiten, zum Durchlaufen einer
Enum
:Dem ersten geben Sie die Werte in der form auf ein array von
object
, und die zweite wird geben Sie Werte in form von Arrays vonString
.Verwenden Sie es in
foreach
Schleife wie folgt:Ich nicht der Meinung das ist besser, oder sogar gut, nur, noch eine andere Lösung.
Wenn die enum-Werte sind streng von 0 bis n - 1, eine generische alternative:
Wenn enum-Werte zusammenhängend sind und Sie können das erste und das Letzte element der enum, dann:
aber das ist nicht unbedingt aufzählen, nur Schleifen. Die zweite Methode ist viel schneller als jeder andere Ansatz, aber...
Wenn du Geschwindigkeit brauchst, und geben Sie die überprüfung zu bauen und führen Sie die Zeit, diese helper-Methode ist besser als die Verwendung von LINQ to cast jedes element:
Und Sie können es verwenden, wie folgt:
Natürlich können Sie zurück
IEnumerable<T>
, aber das kauft man hier nichts.where T: Enum
hier ist ein Beispiel erstellen wählen Sie Optionen für eine DDL -
(Die aktuelle akzeptierte Antwort ist ein cast, glaube ich, nicht
benötigt wird (obwohl ich falsch sein kann).)
Diese Frage wird in Kapitel 10 von "C# - Schritt für Schritt 2013"
Verwendet der Autor eine doppelte for-Schleife zur Iteration über ein paar Enumeratoren (so erstellen Sie ein vollständiges deck von Karten):
In diesem Fall
Suit
undValue
sind beide Aufzählungen:sowie
PlayingCard
ist eine Karte Objekt mit einer definiertenSuit
undValue
:Ich weiß, es ist ein bisschen chaotisch, aber wenn Sie ein fan der one-Liner, hier ist einer:
Was ist, wenn Sie wissen, die Art wird eine
enum
, aber Sie wissen nicht, was der genaue Typ ist zur compile-Zeit?Die Methode
getListOfEnum
verwendet reflektion, um zu nehmen, jedem enum-Typ und gibt einIEnumerable
alle enum-Werte.Verwendung:
Eine einfache und generische Möglichkeit zum konvertieren eines enum-zu etwas, was Sie können interagieren:
Dann:
Dictionary
ist keine gute Idee: wenn Sie eineEnum
wieenum E { A = 0, B = 0 }
, der Wert 0 Hinzugefügt 2 mal die Erzeugung einesArgumentException
(Sie können nicht hinzufügen, das gleicheKey
auf eineDictionary
2-mal oder mehr!).Dictionary<,>
von einer Methode namensToList
? Auch warum nicht zurückDictionary<T, string>
?Add-Methode
public static IEnumerable<T> GetValues<T>()
zu Ihrer Klasse, wieaufrufen, und übergeben Sie Ihre enum, Sie können nun Durchlaufen Sie mit
foreach
enum
Typen werden als "enumeration types" nicht, weil Sie sind Behälter, "aufzählen" Werte (die Sie nicht), sondern weil Sie sind definiert durch aufzählen die möglichen Werte für eine variable dieses Typs.(Eigentlich ist das ein bisschen komplizierter als das - enum-Typen sind als eine "zugrunde liegende" Typ integer, was bedeutet, dass jede enum-Wert entspricht ein integer-Wert (dies ist in der Regel impliziten, aber kann manuell angegeben). C# wurde so entworfen, so dass Sie könnte Sachen alle integer, der Typ in der enum-Variablen, auch wenn es nicht zu einem "namens" - Wert.)
Den System.Enum.GetNames Methode kann verwendet werden, um ein array von strings, die die Namen der enum-Werte, wie der name schon sagt.
EDIT: Sollte haben vorgeschlagen, die System.Enum.GetValues - Methode statt. Oops.
GetNames
- Methode gibt in der Tat ein string-array, aber die OP erfordert ein enumerator durch die Werte.Auch Sie können für die Bindung der öffentlichen static-member der Enumeration direkt mit Reflexion: