Como posso obter o número de itens definido em uma enumeração?
318
Você pode usar o método estático Enum.GetNames
que retorna uma matriz que representa os nomes de todos os itens na enumeração. A propriedade length dessa matriz é igual ao número de itens definidos na enumeração
var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;
A questão é:
O número de "itens" pode realmente significar duas coisas completamente diferentes. Considere o seguinte exemplo.
Qual é o número de "itens" definido em
MyEnum
?O número de itens é 5? (
A
,B
,C
,D
,E
)Ou é 3? (
1
,2
,3
)O número de nomes definidos em
MyEnum
(5) pode ser calculado da seguinte forma.O número de valores definidos em
MyEnum
(3) pode ser calculado da seguinte forma.fonte
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)). Length;
fonte
Um truque bacana que eu vi na resposta C a essa pergunta, basta adicionar um último elemento ao enum e usá-lo para dizer quantos elementos estão no enum:
No caso de você definir um valor inicial diferente de 0, você pode usar NumberOfTypes - Type1 para verificar o número de elementos.
Não tenho certeza se esse método seria mais rápido do que usar o Enum, e também não tenho certeza se seria considerado a maneira correta de fazer isso, pois temos o Enum para verificar essas informações para nós.
fonte
Das respostas anteriores apenas adicionando amostra de código.
fonte
Você pode usar Enum.GetNames para retornar um IEnumerable de valores na sua enumeração e, em seguida, contar o IEnumerable resultante.
GetNames produz praticamente o mesmo resultado que GetValues, mas é mais rápido.
fonte
Se você estiver escrevendo a solução acima tantas vezes quanto eu, poderá implementá-la como um genérico:
fonte
Eu estava analisando isso agora e não estava satisfeito com a legibilidade da solução atual. Se você estiver escrevendo código informalmente ou em um projeto pequeno, basta adicionar outro item ao final da sua enumeração chamado "Comprimento". Dessa forma, você só precisa digitar:
É claro que se outras pessoas usarem seu código - ou tenho certeza de que em muitas outras circunstâncias que não se aplicavam a mim neste caso - essa solução pode estar em qualquer lugar, desde mal aconselhado até terrível.
fonte
Para o Visual Basic:
[Enum].GetNames(typeof(MyEnum)).Length
não funcionou comigo, mas[Enum].GetNames(GetType(Animal_Type)).length
funcionou.fonte