¿Cuál es la forma más eficiente de crear una asignación constante (nunca cambia en tiempo de ejecución) de string
s a int
s?
Intenté usar un diccionario const , pero eso no funcionó.
Podría implementar un contenedor inmutable con la semántica adecuada, pero eso todavía no parece del todo correcto.
Para aquellos que han preguntado, estoy implementando IDataErrorInfo en una clase generada y estoy buscando una manera de hacer que el columnName busque en mi matriz de descriptores.
No sabía (error tipográfico al probar! D'oh!) Que el interruptor acepta cadenas, así que eso es lo que voy a usar. ¡Gracias!
c#
.net
collections
dictionary
constants
David Schmitt
fuente
fuente
Respuestas:
Crear un diccionario constante realmente generado en tiempo de compilación en C # no es realmente una tarea sencilla. En realidad, ninguna de las respuestas aquí realmente logra eso.
Sin embargo, hay una solución que cumple con sus requisitos, aunque no necesariamente una buena; recuerde que de acuerdo con la especificación de C #, las tablas de mayúsculas y minúsculas se compilan en tablas hash jump constantes. Es decir, son diccionarios constantes, no una serie de declaraciones if-else. Entonces considere una declaración de cambio de caso como esta:
Esto es exactamente lo que quieres. Y sí, lo sé, es feo.
fuente
Hay muy pocas colecciones inmutables en el marco actual. Puedo pensar en una opción relativamente indolora en .NET 3.5:
Uso
Enumerable.ToLookup()
: laLookup<,>
clase es inmutable (pero tiene varios valores en la HR); puedes hacer esto de una maneraDictionary<,>
bastante fácil:fuente
fuente
Esto es lo más parecido a un "Diccionario CONST":
El compilador será lo suficientemente inteligente como para construir el código lo más limpio posible.
fuente
Si usara 4.5+ Framework, usaría ReadOnlyDictionary (también ReadOnly Collection para listas) para hacer asignaciones / constantes de solo lectura. Se implementa de la siguiente manera.
fuente
private static readonly Dictionary<string, string> _yourDictionaryName = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase) { { "One",1 }, { "Two",2 }, { "Three",3 }, };
Así es como lo hice.readonly Dictionary<TKey, TValue>
no es equivalente a aReadOnlyDictionary<TKey, TValue>
. De hecho, su forma de "solo lectura" es bastante opuesta entre sí. Ver: dotnetfiddle.net/v0l4aA .¿Por qué no usar espacios de nombres o clases para anidar sus valores? Puede ser imperfecto, pero está muy limpio.
Ahora puede acceder a .ParentClass.FooDictionary.Key1, etc.
fuente
No parece haber una interfaz inmutable estándar para los diccionarios, por lo que, desafortunadamente, la creación de un contenedor parece ser la única opción razonable.
Editar : Marc Gravell encontró el ILookup que me perdí, que le permitirá al menos evitar crear un nuevo contenedor, aunque aún necesita transformar el Diccionario con .ToLookup ().
Si esta es una necesidad restringida a un escenario específico, es mejor que tenga una interfaz más orientada a la lógica empresarial:
fuente
No estoy seguro de por qué nadie mencionó esto, pero en C # para cosas que no puedo asignar const, uso propiedades estáticas de solo lectura.
Ejemplo:
fuente
Solo otra idea, ya que estoy vinculado a un cuadro combinado winforms:
Para obtener el valor int del nombre para mostrar de :
uso:
fuente
Por qué no:
fuente