10
votes

Comment créer un tableau d'énums

J'ai environ 30 Enums de signalisation différents que je voudrais mettre dans une matrice pour l'indexation et l'accès rapide. Permettez-moi également de claifier que je n'ai pas 1 enum avec 30 valeurs, mais j'ai 30 énumjets avec des quantités différentes de valeurs.

L'objectif serait de les ajouter à un tableau à un indice spécifié. De cette façon, je peux écrire une fonction dans laquelle je peux transmettre l'index de la matrice pour définir des valeurs de particulères de l'énum.

mise à jour: Voici un exemple de ce que je veux faire.

Enum principal ( Enum1 = 0, Enum2 = 1, Enumn = N-1) - Cela comporte des index qui correspondraient à l'indice de l'énumé associé

[drapeau] Enum1 (valeur1 = 0, valeur2 = 1, valeur3 = 2, valeur4 = 4 ...)

[drapeau] Enum2 ("")

[drapeau] Enum2 ("")

Puisque j'utilise des énums flagrables, j'ai une classe comme suit xxx


4 commentaires

Peut-être qu'un échantillon de code aiderait ... mais cela ne fait pas un peu de sens pour moi.


Pourquoi souhaitez-vous mettre des types différents dans le même tableau?


"Pour l'indexation et l'accès rapide"? Par qui ou par quoi? Voulez-vous mettre beaucoup d'entiers, de cordes et de flotte dans un tableau pour l'indexation et l'accès rapide? Pourquoi voulez-vous traiter ces énums en tant qu'entités connexes? Je soupçonne fortement que tout ce que vous voulez faire, je lancer des énums dans une matrice est la mauvaise solution.


C'est l'idée la plus belle et vous manquez complètement le point d'énums. On dirait que vous avez besoin d'un dictionnaire, pas une liste d'énums.


4 Réponses :


0
votes

Vous pouvez toujours utiliser un bon ancien objet [] , mais cela signifie faire beaucoup de casting.


0 commentaires

21
votes

Étant donné que vous avez 30 types d'énums différents, vous ne pouvez pas créer un tableau fortement typé pour eux. Le mieux que vous puissiez faire serait un tableau de système.Enum:

Enum[] enums = new Enum[] { enum1.Value1, enum2.Value2, etc };


5 commentaires

Il n'y a vraiment aucun avantage à ce que ce soit en tapant la matrice comme objet . Valègeype est (inintuposté) un type de référence, de sorte que les valeurs seront toujours en boîte.


Ainsi, pourquoi ne pas directement enum)?


@Digemall - vous seriez toujours à couler, mais au moins le tableau ne pouvait contenir rien qui n'est pas un énumé.


@Nelson: Oui, le casting est inévitable (en fait, je n'ai toujours pas la raison de ce type de tableau), mais au moins, vous avez un peu plus de reconstitution du temps de compilation qu'un tableau d'objets ...


J'ai dû avoir un très grand pet de cerveau comme je l'ai regardé en utilisant Enum [] plusieurs fois aujourd'hui et je ne l'ai tout simplement jamais complètement travaillé. Merci pour toute l'aide de Yoru.



2
votes

Si je comprends bien, vous devriez faire:

class Enums
{
  public Enum1 Enum1 { get; set; }
  public Enum2 Enum2 { get; set; }
}

Enums enums = new Enums();
enums.Enum1 = Enum1.Value1;
enums.Enum2 = Enum2.AnotherValue;

if (enums.Enum1 == Enum1.Value1)
...


5 commentaires

Peut-être en faire une structure au lieu d'une classe.


Il y a une limite de 8 paramètres génériques dans le type de tuple. Par convention, le dernier paramètre générique est un tuple contenant les valeurs addional afin que vous puissiez créer un tuple avec plus de 8 en utilisant quelque chose comme: var a = nouveau tuple > (); Mais ce ne serait pas très agréable de traiter.


@Dykam: une structure est généralement utilisée pour une valeur pour empêcher un gros objet avec plusieurs copies. Si vous avez eu quelques énumes, peut-être, mais je pense que 30 Enums devraient vraiment être un type de référence.


@wawa: Je n'avais pas pensé à ça ... :) C'est comme avoir des matrices profondément imbriquées de matrices. Ick!


@Nelson: Oui, c'est assez dégoûtant sauf si vous utilisez une langue comme F # dont le compilateur prend en charge cela pour vous.



0
votes

Enum fournit deux mécanismes permettant de convertir un entier en une valeur enum - la méthode GetValues ​​() et la coulée simple: xxx

Je ne sais pas trop pourquoi vous voulez créer vos propres tableaux Si vous pouvez utiliser l'un de ces mécanismes pour obtenir un énumé d'un int.


0 commentaires