Risposte:
È possibile utilizzare il metodo statico Enum.GetNames
che restituisce un array che rappresenta i nomi di tutti gli elementi nell'enum. La proprietà length di questo array è uguale al numero di elementi definiti nell'enum
var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;
La domanda è:
Come posso ottenere il numero di elementi definiti in una enum?
Il numero di "articoli" potrebbe davvero significare due cose completamente diverse. Considera il seguente esempio.
enum MyEnum
{
A = 1,
B = 2,
C = 1,
D = 3,
E = 2
}
Qual è il numero di "elementi" definiti in MyEnum
?
Il numero di articoli è 5? ( A
, B
, C
, D
, E
)
O è 3? ( 1
, 2
, 3
)
Il numero di nomi definiti in MyEnum
(5) può essere calcolato come segue.
var namesCount = Enum.GetNames(typeof(MyEnum)).Length;
Il numero di valori definiti in MyEnum
(3) può essere calcolato come segue.
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)). Lunghezza;
Un trucco ingegnoso che ho visto in una risposta C a questa domanda, basta aggiungere un ultimo elemento all'enum e usarlo per dire quanti elementi ci sono nell'enum:
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
Nel caso in cui si definisca un valore iniziale diverso da 0, è possibile utilizzare NumberOfTypes - Type1 per accertare il numero di elementi.
Non sono sicuro se questo metodo sarebbe più veloce dell'utilizzo di Enum e non sono sicuro che sarebbe considerato il modo corretto per farlo, dal momento che abbiamo Enum per verificare queste informazioni per noi.
Puoi usare Enum.GetNames per restituire un IEnumerable di valori nel tuo enum e quindi. Conta l'IEnumerable risultante.
GetNames produce quasi lo stesso risultato di GetValues ma è più veloce.
Se ti ritrovi a scrivere la soluzione sopra tutte le volte che posso, allora potresti implementarla come un generico:
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;
}
Lo stavo esaminando proprio ora e non ero contento della leggibilità della soluzione attuale. Se stai scrivendo codice in modo informale o su un piccolo progetto, puoi semplicemente aggiungere un altro elemento alla fine del tuo enum chiamato "Lunghezza". In questo modo, devi solo digitare:
var namesCount = (int)MyEnum.Length;
Ovviamente se altri useranno il tuo codice - o sono sicuro in molte altre circostanze che non mi riguardano in questo caso - questa soluzione può essere ovunque da mal consigliata a terribile.
Per Visual Basic:
[Enum].GetNames(typeof(MyEnum)).Length
non ha funzionato con me, ma
[Enum].GetNames(GetType(Animal_Type)).length
ha funzionato.