Wie kann ich die Anzahl der in einer Aufzählung definierten Elemente ermitteln?
Sie können die statische Methode Enum.GetNames
Gibt ein Array zurück, das die Namen aller Elemente in der Aufzählung darstellt. Die Eigenschaft length dieses Arrays entspricht der Anzahl der in der Enumeration 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 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 MyEnum
definiert?
Ist die Anzahl der Artikel 5? (A
, B
, C
, D
, E
)
Oder ist es 3? (1
, 2
, 3
)
Die Anzahl von Namen, die in MyEnum
(5) definiert ist, kann wie folgt berechnet werden.
var namesCount = Enum.GetNames(typeof(MyEnum)).Length;
Die Anzahl Werte, die in MyEnum
(3) definiert ist, kann wie folgt berechnet werden.
var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count();
Enum.GetValues (typeof (MyEnum)). Length;
Ein geschickter Trick, den ich in einer C-Antwort auf diese Frage gesehen habe: Fügen Sie einfach ein letztes Element zur Aufzählung hinzu und verwenden Sie ihn, um zu bestimmen, wie viele Elemente in der Aufzählung enthalten sind:
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
Wenn Sie einen anderen Startwert als 0 definieren, können Sie NumberOfTypes - Type1 verwenden, um die Anzahl der Elemente zu 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 die richtige Methode ist, 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 Enumeration zurückzugeben, und dann .Count die resultierende IEnumerable.
GetNames erzeugt fast das gleiche Ergebnis wie GetValues, ist jedoch schneller.
Aus den vorherigen Antworten nur Codebeispiel hinzufügen.
class Program
{
static void Main(string[] args)
{
int enumlen = Enum.GetNames(typeof(myenum)).Length;
Console.Write(enumlen);
Console.Read();
}
public enum myenum
{
value1,
value2
}
}
Wenn Sie feststellen, dass Sie die obige Lösung so oft schreiben wie ich, können Sie sie als allgemeine Lösung 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;
}
Für Visual Basic:
[Enum].GetNames(typeof(MyEnum)).Length
hat bei mir nicht funktioniert, aber [Enum].GetNames(GetType(Animal_Type)).length
.
Ich habe gerade darüber nachgedacht und war mit der Lesbarkeit der aktuellen Lösung nicht zufrieden. Wenn Sie Code informell oder in einem kleinen Projekt 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 werden - oder ich bin sicher, unter vielen anderen Umständen, die in diesem Fall nicht auf mich zutrafen.