wake-up-neo.com

Gesamtzahl der in einer Aufzählung definierten Elemente

Wie kann ich die Anzahl der in einer Aufzählung definierten Elemente ermitteln?

289
Rashmi Pandit

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;
393
Kasper Holdum

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();
167
Timothy Shields

Enum.GetValues (typeof (MyEnum)). Length;

72
Matt Hamilton

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.

14
Josh

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.

6
Lucas Willett

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
        }
    }
6
jvanderh

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;
}
4
Matt Parkins

Für Visual Basic:

[Enum].GetNames(typeof(MyEnum)).Length hat bei mir nicht funktioniert, aber [Enum].GetNames(GetType(Animal_Type)).length.

1
S22

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.

1
EnergyWasRaw