Como posso obter o número de itens definido em uma enumeração?
Como posso obter o número de itens definido em uma enumeração?
Respostas:
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 é:
Como posso obter o número de itens definido em uma enumeração?
O número de "itens" pode realmente significar duas coisas completamente diferentes. Considere o seguinte exemplo.
enum MyEnum
{
A = 1,
B = 2,
C = 1,
D = 3,
E = 2
}
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.
var namesCount = Enum.GetNames(typeof(MyEnum)).Length;
O número de valores definidos em MyEnum
(3) pode ser calculado da seguinte forma.
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)). Length;
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:
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
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.
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.
Se você estiver escrevendo a solução acima tantas vezes quanto eu, poderá implementá-la como um 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;
}
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:
var namesCount = (int)MyEnum.Length;
É 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.
Para o Visual Basic:
[Enum].GetNames(typeof(MyEnum)).Length
não funcionou comigo, mas
[Enum].GetNames(GetType(Animal_Type)).length
funcionou.