Número total de elementos definidos en una enumeración

¿Cómo puedo obtener la cantidad de elementos definidos en una enumeración?

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; 

La pregunta es:

¿Cómo puedo obtener la cantidad de elementos definidos en una enumeración?

La cantidad 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 “artículos” definidos en MyEnum ?

¿El número de elementos es 5? ( A , B , C , D , E )

¿O es 3? ( 1 , 2 , 3 )

El número de nombres definidos en MyEnum (5) se puede calcular de la siguiente manera.

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

La cantidad de valores definidos en MyEnum (3) se puede calcular de la siguiente manera.

 var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast().Distinct().Count(); 

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

Un ingenioso truco que vi en una C respuesta a esta pregunta, solo agrega un último elemento a la enumeración y úsala para decir cuántos elementos hay en la enumeración:

 enum MyType { Type1, Type2, Type3, NumberOfTypes } 

En el 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.

De las respuestas anteriores simplemente agregando código de muestra.

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

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.

Si te encuentras escribiendo la solución anterior tan a menudo como yo lo hago, puedes implementarla como genérico:

 public static int GetEnumEntries() where T : struct, IConvertible { if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type"); return Enum.GetNames(typeof(T)).Length; } 

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, solo necesitas 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 aplicaron a mí en este caso, esta solución puede ser desde mal aconsejada hasta terrible.

Para Visual Basic:

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