Quelle est la manière la plus efficace de créer un mappage constant (ne change jamais à l'exécution) de string
s à int
s?
J'ai essayé d'utiliser un dictionnaire const , mais cela n'a pas fonctionné.
Je pourrais implémenter un wrapper immuable avec une sémantique appropriée, mais cela ne semble toujours pas tout à fait correct.
Pour ceux qui ont demandé, j'implémente IDataErrorInfo dans une classe générée et je cherche un moyen d'effectuer la recherche columnName dans mon tableau de descripteurs.
Je n'étais pas au courant (faute de frappe lors du test! D'oh!) Que le commutateur accepte les chaînes, c'est donc ce que je vais utiliser. Merci!
c#
.net
collections
dictionary
constants
David Schmitt
la source
la source
Réponses:
La création d'un dictionnaire de constantes réellement généré au moment de la compilation en C # n'est pas vraiment une tâche simple. En fait, aucune des réponses ici n'y parvient vraiment.
Il existe cependant une solution qui répond à vos besoins, mais pas nécessairement une solution intéressante; rappelez-vous que selon la spécification C #, les tables de commutation sont compilées en tables de sauts de hachage constant. Autrement dit, ce sont des dictionnaires constants, pas une série d'instructions if-else. Considérons donc une instruction switch-case comme celle-ci:
C'est exactement ce que vous voulez. Et oui, je sais, c'est moche.
la source
Il existe quelques précieuses collections immuables dans le cadre actuel. Je peux penser à une option relativement simple dans .NET 3.5:
Utilisation
Enumerable.ToLookup()
- laLookup<,>
classe est immuable (mais à valeurs multiples sur les rhs); vous pouvez le faireDictionary<,>
assez facilement:la source
la source
Voici la chose la plus proche que vous puissiez obtenir dans un "Dictionnaire CONST":
Le compilateur sera suffisamment intelligent pour créer le code aussi propre que possible.
la source
Si vous utilisez 4.5+ Framework, j'utiliserais ReadOnlyDictionary (également ReadOnly Collection pour les listes) pour faire des mappages / constantes en lecture seule. Il est mis en œuvre de la manière suivante.
la source
private static readonly Dictionary<string, string> _yourDictionaryName = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase) { { "One",1 }, { "Two",2 }, { "Three",3 }, };
Voilà comment je l'ai fait.readonly Dictionary<TKey, TValue>
n'est pas équivalent à aReadOnlyDictionary<TKey, TValue>
. En fait, la manière dont ils sont «en lecture seule» est assez opposée. Voir: dotnetfiddle.net/v0l4aA .Pourquoi ne pas utiliser des espaces de noms ou des classes pour imbriquer vos valeurs? C'est peut-être imparfait, mais c'est très propre.
Vous pouvez maintenant accéder à .ParentClass.FooDictionary.Key1, etc.
la source
Il ne semble pas y avoir d'interface immuable standard pour les dictionnaires, donc la création d'un wrapper semble être la seule option raisonnable, malheureusement.
Edit : Marc Gravell a trouvé le ILookup que j'ai manqué - cela vous permettra au moins d'éviter de créer un nouveau wrapper, même si vous devez encore transformer le dictionnaire avec .ToLookup ().
S'il s'agit d'un besoin limité à un scénario spécifique, vous pourriez être mieux avec une interface plus orientée vers la logique métier:
la source
Je ne sais pas pourquoi personne n'a mentionné cela, mais en C # pour les choses que je ne peux pas attribuer à const, j'utilise des propriétés statiques en lecture seule.
Exemple:
la source
Juste une autre idée puisque je suis lié à une combobox winforms:
Pour obtenir la valeur int à partir du nom d'affichage à partir de :
usage:
la source
Pourquoi pas:
la source