leer - obtener key de un diccionario c#
Declarar un diccionario dentro de una clase estática (9)
Cree un constructor estático para agregar valores en el diccionario
enum Commands
{
StudentDetail
}
public static class Quires
{
public static Dictionary<Commands, String> quire
= new Dictionary<Commands, String>();
static Quires()
{
quire.add(Commands.StudentDetail,@"SELECT * FROM student_b");
}
}
¿Cómo declarar un objeto de diccionario estático dentro de una clase estática? Lo intenté
public static class ErrorCode
{
public const IDictionary<string, string> ErrorCodeDic = new Dictionary<string, string>()
{
{ "1", "User name or password problem" }
};
}
Pero el compilador se queja de que " Un campo const de un tipo de referencia que no sea una cadena solo se puede inicializar con nulo ".
El problema con su ejemplo inicial se debió principalmente al uso de const
lugar de static
; no puede crear una referencia de referencia no nula en C #.
Creo que esto también habría funcionado:
public static class ErrorCode
{
public static IDictionary<string, string> ErrorCodeDic
= new Dictionary<string, string>()
{ {"1", "User name or password problem"} };
}
Además, como Y Low señala, también es una buena idea agregar readonly
, y ninguno de los modificadores discutidos aquí evitará que el diccionario en sí sea modificado.
Haga que el diccionario sea estático y nunca lo agregue fuera del ctor de su objeto estático. Esa parece ser una solución más simple que jugar con las reglas estáticas / const en C #.
La sintaxis correcta (como se probó en VS 2008 SP1) es la siguiente:
public static class ErrorCode
{
public static IDictionary<string, string> ErrorCodeDic;
static ErrorCode()
{
ErrorCodeDic = new Dictionary<string, string>()
{ {"1", "User name or password problem"} };
}
}
OK, entonces estoy trabajando en ASP 2.x (no es mi elección ... pero, ¿quién está maldiciendo?).
Ninguno de los ejemplos del Diccionario de inicialización funcionaría. Luego me encontré con esto: http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-dictionaries-and-collections.aspx
... lo que me hizo pensar que no se puede usar la inicialización de colecciones en ASP 2.x.
Puede usar el constructor estático / de clase para inicializar su diccionario:
public static class ErrorCode
{
public const IDictionary<string, string> ErrorCodeDic;
public static ErrorCode()
{
ErrorCodeDic = new Dictionary<string, string>()
{ {"1", "User name or password problem"} };
}
}
Si quieres declarar el diccionario una vez y nunca cambiarlo, declaralo como de solo lectura:
private static readonly Dictionary<string, string> ErrorCodes
= new Dictionary<string, string>
{
{ "1", "Error One" },
{ "2", "Error Two" }
};
Si desea que los elementos del diccionario sean de solo lectura (no solo la referencia sino también los elementos de la colección), deberá crear una clase de diccionario de solo lectura que implemente IDictionary.
Consulte ReadOnlyCollection para referencia.
BTW const solo se puede usar cuando se declaran valores escalares en línea.
Una vieja pregunta, pero encontré esto útil. Resulta que también hay una clase especializada para un diccionario que usa una cadena para la clave y el valor:
private static readonly StringDictionary SegmentSyntaxErrorCodes = new StringDictionary
{
{ "1", "Unrecognized segment ID" },
{ "2", "Unexpected segment" }
};
Editar: Por el comentario de Chris a continuación, usar Dictionary<string, string>
sobre StringDictionary
es generalmente preferido, pero dependerá de su situación. Si está tratando con una base de códigos anterior, puede estar limitado a StringDictionary
. Además, tenga en cuenta que la siguiente línea:
myDict["foo"]
devolverá null si myDict
es un StringDictionary
, pero se StringDictionary
una excepción en el caso de Dictionary<string, string>
. Consulte la publicación SO que mencionó para obtener más información, que es la fuente de esta edición.
public static class ErrorCode
{
public const IDictionary<string , string > m_ErrorCodeDic;
public static ErrorCode()
{
m_ErrorCodeDic = new Dictionary<string, string>()
{ {"1","User name or password problem"} };
}
}
Probablemente inicie en el constructor.