Wie kann ich die Anzahl der in einer Aufzählung definierten Elemente ermitteln?
Wie kann ich die Anzahl der in einer Aufzählung definierten Elemente ermitteln?
Antworten:
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:
Wie kann ich die Anzahl der in einer Aufzählung definierten Elemente ermitteln?
Die Anzahl der "Gegenstände" könnte wirklich zwei völlig verschiedene Dinge bedeuten. Betrachten Sie das folgende Beispiel.
enum MyEnum
{
A = 1,
B = 2,
C = 1,
D = 3,
E = 2
}
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 NamenMyEnum
kann wie folgt berechnet werden.
var namesCount = Enum.GetNames(typeof(MyEnum)).Length;
Die Anzahl der in (3) definierten WerteMyEnum
kann wie folgt berechnet werden.
var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count();
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;
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:
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
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.
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.
Wenn Sie feststellen, dass Sie die obige Lösung so oft schreiben wie ich, können Sie sie generisch implementieren:
public static int GetEnumEntries<T>() where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new ArgumentException("T must be an enumerated type");
return Enum.GetNames(typeof(T)).Length;
}
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:
var namesCount = (int)MyEnum.Length;
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.
Für Visual Basic:
[Enum].GetNames(typeof(MyEnum)).Length
hat nicht mit mir gearbeitet, aber
[Enum].GetNames(GetType(Animal_Type)).length
getan.