Wie kann ich die Anzahl der in einer Aufzählung definierten Elemente ermitteln?
318
Sie können die statische Methode verwenden, Enum.GetNames
die ein Array zurückgibt, das die Namen aller Elemente in der Aufzählung darstellt. Die Längeneigenschaft dieses Arrays entspricht der Anzahl der in der Aufzählung definierten Elemente
var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;
Die Frage ist:
Die Anzahl der "Gegenstände" könnte wirklich zwei völlig verschiedene Dinge bedeuten. Betrachten Sie das folgende Beispiel.
Wie viele "Elemente" sind in definiert?
MyEnum
?Ist die Anzahl der Artikel 5? (
A
,B
,C
,D
,E
)Oder ist es 3? (
1
,2
,3
)Die Anzahl der in (5) definierten Namen
MyEnum
kann wie folgt berechnet werden.Die Anzahl der in (3) definierten Werte
MyEnum
kann wie folgt berechnet werden.quelle
var valuesCount = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Distinct().Count();
.Default = 1, A4 = 1, Portrate = 1, A4Portrait = 1, Landscape = 2, A4Landscape = 2, ...
;).Enum.GetValues (typeof (MyEnum)). Length;
quelle
Ein geschickter Trick, den ich in einer C-Antwort auf diese Frage gesehen habe. Fügen Sie der Aufzählung einfach ein letztes Element hinzu und verwenden Sie es, um festzustellen, wie viele Elemente sich in der Aufzählung befinden:
Wenn Sie einen anderen Startwert als 0 definieren, können Sie mit NumberOfTypes - Type1 die Anzahl der Elemente ermitteln.
Ich bin mir nicht sicher, ob diese Methode schneller ist als die Verwendung von Enum, und ich bin mir auch nicht sicher, ob dies als der richtige Weg angesehen wird, da wir Enum haben, um diese Informationen für uns zu ermitteln.
quelle
Aus den vorherigen Antworten nur Codebeispiel hinzufügen.
quelle
Sie können Enum.GetNames verwenden, um eine IEnumerable von Werten in Ihrer Enum zurückzugeben, und dann .Count die resultierende IEnumerable.
GetNames liefert fast das gleiche Ergebnis wie GetValues, ist jedoch schneller.
quelle
Wenn Sie feststellen, dass Sie die obige Lösung so oft schreiben wie ich, können Sie sie generisch implementieren:
quelle
Ich habe mich gerade damit befasst und war mit der Lesbarkeit der aktuellen Lösung nicht zufrieden. Wenn Sie informell oder in einem kleinen Projekt Code schreiben, können Sie am Ende Ihrer Aufzählung einfach ein weiteres Element mit dem Namen "Länge" hinzufügen. Auf diese Weise müssen Sie nur Folgendes eingeben:
Natürlich kann diese Lösung von schlecht beraten bis schrecklich sein, wenn andere Ihren Code verwenden - oder ich bin mir sicher, dass dies unter vielen anderen Umständen nicht auf mich zutrifft.
quelle
Für Visual Basic:
[Enum].GetNames(typeof(MyEnum)).Length
hat nicht mit mir gearbeitet, aber[Enum].GetNames(GetType(Animal_Type)).length
getan.quelle