2009-05-13 12 views

Respuesta

304

Puede usar el método estático Enum.GetNames que devuelve una matriz que representa los nombres de todos los elementos en la enumeración. La propiedad de longitud de esta matriz es igual a la cantidad de elementos definidos en la enumeración

var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length; 
+0

De acuerdo ... aquí hay un enlace que encontré http://www.csharp411.com/c-count-items-in-an-enum/ –

+5

También podría usar Enum.GetValues. – Xonatron

+0

System.Enum.GetNames, si todavía no incluye el espacio de nombres del sistema. –

67

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

+2

Es más rápido utilizar el método GetNames. –

+0

¿Los resultados deben almacenarse en caché en una clase de utilidad? – djmj

+1

Lo envié de vuelta; de lo contrario, es una versión menos útil de la respuesta aceptada. – Flexo

5

Puede usar Enum.GetNames para devolver un IEnumerable de valores en su enumeración y luego .Consumir el IEnumerable resultante.

GetNames produce el mismo resultado que GetValues ​​pero es más rápido.

6

A partir de las respuestas anteriores solo se agrega una muestra de código.

class Program 
    { 
     static void Main(string[] args) 
     { 
      int enumlen = Enum.GetNames(typeof(myenum)).Length; 
      Console.Write(enumlen); 
      Console.Read(); 
     } 
     public enum myenum 
     { 
      value1, 
      value2 
     } 
    } 
9

Un truco ingenioso que vi en una respuesta C a esta pregunta, sólo tiene que añadir un último elemento de la enumeración y lo utilizan para contar cuántos elementos hay en la enumeración:

enum MyType { 
    Type1, 
    Type2, 
    Type3, 
    NumberOfTypes 
} 

En el En caso de que esté definiendo un valor de inicio distinto de 0, puede usar NumberOfTypes - Type1 para determinar la cantidad de elementos.

No estoy seguro si este método sería más rápido que usar Enum, y tampoco estoy seguro de si se consideraría la forma correcta de hacerlo, ya que tenemos Enum para verificar esta información para nosotros.

+0

esto es bueno ya que puedo hacer esto en XNA porque GetNames no está disponible allí –

+0

Truco genial, esto también sería más rápido que GetNames() porque no tiene que contarlos. –

+3

¡Tenga cuidado con el código que recorre las enum a través de foreach, puede leer desde el final de sus matrices! –

140

La pregunta es:

¿Cómo puedo obtener el número de elementos definidos en una enumeración?

El número de "elementos" realmente podría significar dos cosas completamente diferentes. Considera el siguiente ejemplo.

enum MyEnum 
{ 
    A = 1, 
    B = 2, 
    C = 1, 
    D = 3, 
    E = 2 
} 

¿Cuál es el número de "elementos" se define en MyEnum?

Es el número de elementos 5? (A, B, C, D, E)

O es 3? (1, 2, 3)

El número de nombres definidos en MyEnum (5) se puede calcular como sigue.

var namesCount = Enum.GetNames(typeof(MyEnum)).Length; 

El número de valores definidos en MyEnum (3) puede ser calculada como sigue.

var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count(); 
+16

Esto debería votarse a la cima. – Xonatron

+1

Forma alternativa de escribir la última línea, 'var valuesCount = ((MyEnum []) Enum.GetValues ​​(typeof (MyEnum))) Distinct(). Count();'. –

3

Para Visual Basic:

[Enum].GetNames(typeof(MyEnum)).Length no funcionó conmigo, pero [Enum].GetNames(GetType(Animal_Type)).length lo hicieron.

+0

¿Por qué el voto a favor? Esto solucionó mi problema, es la sintaxis correcta para VB, aunque la pregunta está etiquetada C#, sigue siendo útil. –

+0

Votos bajos probablemente porque la pregunta está etiquetada C# y esta respuesta no menciona que no estaba usando C#. – idbrii

-1

Estaba investigando esto ahora, y no estaba contento con la legibilidad de la solución actual. Si está escribiendo código de manera informal o en un proyecto pequeño, puede agregar otro elemento al final de su enumeración llamada "Longitud". De esta manera, sólo tendrá que escribir:

var namesCount = (int)MyEnum.Length; 

Por supuesto, si otros van a utilizar su código - o estoy seguro de que en muchas otras circunstancias que no se aplicaba a mí en este caso - esta solución puede ser de mal aconsejado a terrible.

+1

Esto también se basa en la enumeración que comienza en 0 (el valor predeterminado, pero de ninguna manera garantizado). Además, hace que el intellisense para el uso de enum normal * muy * confuso. Esta es casi siempre una idea ** terrible **. – BradleyDotNET

+1

Eso no tomó mucho tiempo :) – EnergyWasRaw

+1

Interesante, supongo que nunca se sabe cuando puede ocurrir algo mejor. Hice mi mejor intento para evitar mi propia solución, ¡pero me pareció lo suficientemente interesante como para compartir! – EnergyWasRaw

2

Si usted se encuentra escribiendo la solución anterior tantas veces como yo, entonces podría implementarlo como un genérico:

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; 
} 
Cuestiones relacionadas