obtener el valor del diccionario por clave


183

¿Cómo puedo obtener el valor del diccionario por clave en la función

mi código de función es este (y el comando que intento pero no funcionó):

static void XML_Array(Dictionary<string, string> Data_Array)
{
    String xmlfile = Data_Array.TryGetValue("XML_File", out value);
}

mi código de botón es este

private void button2_Click(object sender, EventArgs e)
{
    Dictionary<string, string> Data_Array = new Dictionary<string, string>();
    Data_Array.Add("XML_File", "Settings.xml");

    XML_Array(Data_Array);
}

Quiero algo como esto:
en la XML_Arrayfunción ser
string xmlfile = Settings.xml

Respuestas:


249

Es tan simple como esto:

String xmlfile = Data_Array["XML_File"];

Tenga en cuenta que si el diccionario no tiene una clave igual "XML_File", ese código arrojará una excepción. Si desea verificar primero, puede usar TryGetValue de esta manera:

string xmlfile;
if (!Data_Array.TryGetValue("XML_File", out xmlfile)) {
   // the key isn't in the dictionary.
   return; // or whatever you want to do
}
// xmlfile is now equal to the value

73

¿Por qué no simplemente usar el nombre de la clave en el diccionario? C # tiene esto:

 Dictionary<string, string> dict = new Dictionary<string, string>();
 dict.Add("UserID", "test");
 string userIDFromDictionaryByKey = dict["UserID"];

Si nos fijamos en la sugerencia de propina:

ingrese la descripción de la imagen aquí


44
Lanza una excepción si la clave no existe. Es por eso que las respuestas de otras personas sugieren que debe usar TryGetValue.
Ladislav Ondris

No lo creo, esa es la razón.
FrenkyB

1
¿Qué quieres decir?
Ladislav Ondris

1
No creo que esta sea la razón por la que otros están sugiriendo TryGetValue. Mi solución es la simplificación, de la que no estaba al tanto. Cuando lo descubrí, lo pegué aquí. Y parece que muchos otros no sabían sobre eso también. De lo contrario, también podrían pegar esta respuesta y agregar que arroja una excepción si la clave no existe. De todos modos, gracias por la advertencia.
FrenkyB

31

Así no es como TryGetValuefunciona. Devuelve trueo se falsebasa en si se encuentra la clave o no, y establece su outparámetro en el valor correspondiente si la clave está allí.

Si desea verificar si la clave está allí o no y hacer algo cuando falta, necesita algo como esto:

bool hasValue = Data_Array.TryGetValue("XML_File", out value);
if (hasValue) {
    xmlfile = value;
} else {
    // do something when the value is not there
}

21
Dictionary<String,String> d = new Dictionary<String,String>();
        d.Add("1","Mahadev");
        d.Add("2","Mahesh");
        Console.WriteLine(d["1"]);// it will print Value of key '1'

5
static void XML_Array(Dictionary<string, string> Data_Array)
{
    String value;
    if(Data_Array.TryGetValue("XML_File", out value))
    {
     ... Do something here with value ...
    }
}

5
static String findFirstKeyByValue(Dictionary<string, string> Data_Array, String value)
{
    if (Data_Array.ContainsValue(value))
    {
        foreach (String key in Data_Array.Keys)
        {
            if (Data_Array[key].Equals(value))
                return key;
        }
    }
    return null;
}

2
          private void button2_Click(object sender, EventArgs e)
            {
                Dictionary<string, string> Data_Array = new Dictionary<string, string>();
                Data_Array.Add("XML_File", "Settings.xml");

                XML_Array(Data_Array);
            }
          static void XML_Array(Dictionary<string, string> Data_Array)
            {
                String xmlfile = Data_Array["XML_File"];
            }

2

Aquí hay un ejemplo que uso en mi código fuente. Obtengo clave y valor del Diccionario del elemento 0 al número de elementos en mi Diccionario. Luego lleno mi matriz de cadena [] que envío como parámetro después en mi función que acepta solo la cadena de parámetros []

    Dictionary<string, decimal> listKomPop = addElements();
    int xpopCount = listKomPop.Count;
    if (xpopCount > 0)
    {
        string[] xpostoci = new string[xpopCount];
        for (int i = 0; i < xpopCount; i++)
        {
            /* here you have key and value element */
            string key = listKomPop.Keys.ElementAt(i);
            decimal value = listKomPop[key];

            xpostoci[i] = value.ToString();
        }
    ...

Espero que esto te ayude a ti y a los demás. Esta solución también funciona con SortedDictionary.

Saludos cordiales,

Ozren Sirola


1

Utilizo un método similar al de dasblinkenlight en una función para devolver un solo valor de clave de una Cookie que contiene una matriz JSON cargada en un Diccionario de la siguiente manera:

    /// <summary>
    /// Gets a single key Value from a Json filled cookie with 'cookiename','key' 
    /// </summary>
    public static string GetSpecialCookieKeyVal(string _CookieName, string _key)
    {
        //CALL COOKIE VALUES INTO DICTIONARY
        Dictionary<string, string> dictCookie =
        JsonConvert.DeserializeObject<Dictionary<string, string>>
         (MyCookinator.Get(_CookieName));

        string value;
        if (dictCookie.TryGetValue( _key, out value))
        {
            return value;
        }
        else
        {
            return "0";
        }

    }

Donde "MyCookinator.Get ()" es otra función de cookie simple que obtiene un valor general de cookie http.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.