Comment puis-je obtenir le nombre d'éléments définis dans une énumération?
Vous pouvez utiliser la méthode statique Enum.GetNames
qui renvoie un tableau représentant les noms de tous les éléments de l’énumération. La propriété length de ce tableau est égale au nombre d'éléments définis dans l'énumération.
_var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;
_
La question est:
Comment puis-je obtenir le nombre d'éléments définis dans une énumération?
Le nombre "d'éléments" pourrait en réalité signifier deux choses complètement différentes. Prenons l'exemple suivant.
enum MyEnum
{
A = 1,
B = 2,
C = 1,
D = 3,
E = 2
}
Quel est le nombre "d'éléments" défini dans MyEnum
?
Est-ce que le nombre d'éléments 5? (A
, B
, C
, D
, E
)
Ou est-ce 3? (1
, 2
, 3
)
Le nombre de noms défini dans MyEnum
(5) peut être calculé comme suit.
var namesCount = Enum.GetNames(typeof(MyEnum)).Length;
Le nombre de valeurs défini dans MyEnum
(3) peut être calculé comme suit.
var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count();
Enum.GetValues (typeof (MyEnum)). Length;
Une astuce astucieuse que j'ai trouvée dans une réponse en C à cette question, ajoutez simplement un dernier élément à l'énum et utilisez-la pour indiquer le nombre d'éléments contenus dans l'énum:
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
Dans le cas où vous définissez une valeur de départ autre que 0, vous pouvez utiliser NumberOfTypes - Type1 pour déterminer le nombre d'éléments.
Je ne sais pas si cette méthode serait plus rapide qu'en utilisant Enum, ni si elle serait considérée comme la meilleure façon de le faire, car nous avons Enum pour vérifier cette information pour nous.
Vous pouvez utiliser Enum.GetNames pour renvoyer un IEnumerable de valeurs dans votre enum, puis .Count le IEnumerable résultant.
GetNames produit à peu près le même résultat que GetValues mais est plus rapide.
A partir des réponses précédentes, ajoutez simplement un exemple de code.
class Program
{
static void Main(string[] args)
{
int enumlen = Enum.GetNames(typeof(myenum)).Length;
Console.Write(enumlen);
Console.Read();
}
public enum myenum
{
value1,
value2
}
}
Si vous écrivez la solution ci-dessus aussi souvent que moi, vous pouvez l'implémenter en tant que générique:
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;
}
Pour Visual Basic:
[Enum].GetNames(typeof(MyEnum)).Length
n'a pas fonctionné avec moi, mais [Enum].GetNames(GetType(Animal_Type)).length
l'a fait.
J'examinais cela tout à l'heure et je n'étais pas satisfait de la lisibilité de la solution actuelle. Si vous écrivez du code de manière informelle ou sur un petit projet, vous pouvez simplement ajouter un autre élément à la fin de votre enum appelé "Longueur". De cette façon, il vous suffit de taper:
var namesCount = (int)MyEnum.Length;
Bien sûr, si d'autres personnes utilisent votre code - ou, j'en suis sûr, dans de nombreuses autres circonstances qui ne me concernaient pas dans ce cas-là, cette solution peut être très mal foutue ou terrible.