¿Cómo puedo obtener el número de elementos definidos en una enumeración?
¿Cómo puedo obtener el número de elementos definidos en una enumeración?
Respuestas:
Puede usar el método estático Enum.GetNames
que devuelve una matriz que representa los nombres de todos los elementos de la enumeración. La propiedad de longitud de esta matriz es igual al número de elementos definidos en la enumeración
var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;
La pregunta es:
¿Cómo puedo obtener el número de elementos definidos en una enumeración?
El número de "artículos" realmente podría significar dos cosas completamente diferentes. Considere 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
?
¿Es el número de artículos 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;
El número de valores definidos en MyEnum
(3) se puede calcular de la siguiente manera.
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)). Longitud;
Un ingenioso truco que vi en una respuesta C a esta pregunta, solo agregue un último elemento a la enumeración y úselo 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 inicial distinto de 0, puede usar NumberOfTypes - Type1 para determinar el número de elementos.
No estoy seguro de 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 averiguar esta información por nosotros.
Puede usar Enum.GetNames para devolver un IEnumerable de valores en su enumeración y luego .Cuenta el IEnumerable resultante.
GetNames produce el mismo resultado que GetValues pero es más rápido.
Si te encuentras escribiendo la solución anterior con tanta frecuencia como yo, entonces podrías implementarla como genérica:
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;
}
Estaba investigando esto justo 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, simplemente puede agregar otro elemento al final de su enumeración llamado "Longitud". De esta manera, solo necesita escribir:
var namesCount = (int)MyEnum.Length;
Por supuesto, si otros van a usar su código, o estoy seguro de que en muchas otras circunstancias que no se aplican a mí en este caso, esta solución puede ser desde desaconsejable hasta terrible.
Para Visual Basic:
[Enum].GetNames(typeof(MyEnum)).Length
no funcionó conmigo, pero lo
[Enum].GetNames(GetType(Animal_Type)).length
hizo.