2010-11-03 20 views
5

Cómo evitar el error si la clave es nula?Cómo evitar errores de clave nula en el diccionario?

//Getter/setter 
public static Dictionary<string, string> Dictionary 
{ 
    get { return Global.dictionary; } 
    set { Global.dictionary = value; } 
} 

ACTUALIZACIÓN:

Dictionary.Add("Key1", "Text1"); 
Dictionary["Key2"] <-error! so what can I write in the GET to avoid error? 

Gracias.

respetos

+1

El código no se ajusta a la pregunta ... ¿Dónde está su clave? –

Respuesta

14

Uso TryGetValue:

Dictionary<int, string> dict = ...; 
string value; 

if (dict.TryGetValue(key, out value)) 
{ 
    // value found 
    return value; 
} 
else 
{ 
    // value not found, return what you want 
} 
+0

+ 1Utilice el método de prueba. No use el método contains si desea recuperar el valor; será ineficiente, ya que efectivamente hará la búsqueda dos veces. –

0

Una clave nunca puede ser nula en un diccionario. Un diccionario es una tabla hash donde, por definición, necesita una clave no vacía o la función hash no puede asignarse al elemento correspondiente.

+0

cómo comprobar si es nulo y devolver una cadena vacía? – eman

+0

Creo que esa fue su pregunta, cómo evitar que un 'nulo' se establezca como clave ... sin embargo, su código no se ajusta a esa suposición. – Bobby

+0

En su código, nunca accede al diccionario por clave. Simplemente devuelve un diccionario estático. No entiendo a qué te refieres. –

9

Puede usar el método Dictionary.ContainsKey.

Por lo que iba a escribir:

if (myDictionary.ContainsKey("Key2")) 
{ 
    // Do something. 
} 

Las otras alternativas son o bien envolver el acceso en un bloque try...catch o utilizar TryGetValue (ver los ejemplos en la página de MSDN ligado a).

string result = null; 
if (dict.TryGetValue("Key2", out result)) 
{ 
    // Do something with result 
} 

El TryGetMethod es más eficiente si se quiere hacer algo con el resultado de que no se necesita una segunda llamada para obtener el valor (como lo haría con el método ContainsKey).

(Por supuesto, en ambos métodos se habría reemplazar "Key2" con una variable.)

+0

¡No me refiero a un método sino a una declaración! – eman

+0

@eman - No entiendo tu pregunta entonces. ¿Puedes actualizar el código para mostrar exactamente lo que estás tratando de lograr? – ChrisF

0

usted está volviendo algo incorrecto. No devuelva el diccionario, pase una clave y devuelva el valor.

public static string GetValue(string key) 
{ 
    if(Global.dictionary.ContainsKey(key)) 
    { 
     return Global.dictionary[key]; 
    } 

    return ""; // or some other value 
} 
2

un método de extensión:

public static TValue GetValue<TKey, TValue>(this Dictionary<TKey, TValue> dic, TKey key) 
{ 
    TValue result; 
    return dic.TryGetValue(key, out result) ? 
     result : 
     default(TValue); 
} 

Uso:

var dic = new Dictionary<string, string> 
{ 
    { "key", "value" } 
}; 

string r1 = dic.GetValue("key"); // "value" 
string r2 = dic.GetValue("false"); // null 
Cuestiones relacionadas