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

Matei Zoc
fuente

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
Blorgbeard está fuera
fuente
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í

FrenkyB
fuente
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
}
dasblinkenlight
fuente
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'
Mahadev Mane
fuente
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 ...
    }
}
aqwert
fuente
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;
}
Jacek Lisiński
fuente
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"];
            }
Sumon Banerjee
fuente
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

Shixx
fuente
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.

Martin Sansone - MiOEE
fuente
-1
if (Data_Array["XML_File"] != "") String xmlfile = Data_Array["XML_File"];
Abdalla Elmedani
fuente