163 votes

Créer un dictionnaire constant en C #

Quel est le moyen le plus efficace pour créer une constante (ne change jamais au moment de l'exécution) la cartographie de strings pour ints?

J'ai essayé d'utiliser un const Dictionnaire, mais cela ne fonctionne pas.

J'ai pu mettre en œuvre une immuable wrapper avec appropriée de la sémantique, mais qui ne semble pas encore tout à fait raison.


Pour ceux qui l'ont demandé, je me suis mise en œuvre de IDataErrorInfo dans une classe générée et suis à la recherche d'un moyen de rendre le columnName recherche dans mon tableau de descripteurs.

Je n'étais pas au courant (faute de frappe lors de l'essai! oh pinaise!) cette commande accepte les chaînes, c'est ce que je vais utiliser. Merci!

212voto

Tamas Czinege Points 49277

La création d'un véritable moment de la compilation généré constante dictionnaire en C# n'est pas vraiment une tâche facile. En fait, aucune des réponses ici vraiment y parvenir.

Il y a une solution qui répond à vos exigences, mais pas nécessairement un bien; rappelez-vous que, selon la spécification C#, cas de commutateur tables sont compilés à la constante de hachage sauter les tables. Qui est, ils sont constants dictionnaires, pas une série de if-else. Donc envisager une instruction de cas switch comme ceci:

switch (myString)
{
   case "cat": return 0;
   case "dog": return 1;
   case "elephant": return 3;
}

C'est exactement ce que vous voulez. Et oui, je sais, c'est moche.

41voto

Marc Gravell Points 482669

Il existe peu de collections immuables dans le cadre actuel. Je peux penser à une option relativement simple dans .NET 3.5:

Utilisez Enumerable.ToLookup() - la classe Lookup<,> est immuable (mais multivaluée sur la droite); vous pouvez le faire facilement de Dictionary<,> :

     Dictionary<string, int> ids = new Dictionary<string, int> {
      {"abc",1}, {"def",2}, {"ghi",3}
    };
    ILookup<string, int> lookup = ids.ToLookup(x => x.Key, x => x.Value);
    int i = lookup["def"].Single();
 

18voto

Richard Poole Points 2410
enum Constants
{
    Abc = 1,
    Def = 2,
    Ghi = 3
}

...

int i = (int)Enum.Parse(typeof(Constants), "Def");

11voto

Timothy Khouri Points 14640

Ceci est la chose la plus proche que vous pouvez obtenir à un "Dictionnaire CONST":

 public static int GetValueByName(string name)
{
    switch (name)
    {
        case "bob": return 1;
        case "billy": return 2;
        default: return -1;
    }
}
 

Le compilateur sera suffisamment intelligent pour générer le code le plus propre possible.

1voto

Sander Points 9804

Il ne semble pas y avoir de norme immuable de l'interface pour les dictionnaires, afin de créer un wrapper semble être la seule option raisonnable, malheureusement.

Edit: Marc Gravel trouvé le ILookup que j'ai manqué - qui vous permettra au moins d'éviter de créer un nouveau wrapper, même si vous avez encore besoin de transformer le Dictionnaire .ToLookup().

Si c'est un besoin limité à un scénario spécifique, vous pourriez être mieux avec une logique de gestion d'une interface orientée:

interface IActiveUserCountProvider
{
    int GetMaxForServer(string serverName);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X