obter valor do dicionário por chave

183

Como posso obter o valor do dicionário por tecla na função

meu código de função é este (e o comando que eu tento, mas não funcionou):

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

meu código de botão é esse

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);
}

Eu quero algo como isto:
na XML_Arrayfunção ser
string xmlfile = Settings.xml

Matei Zoc
fonte

Respostas:

249

É simples assim:

String xmlfile = Data_Array["XML_File"];

Observe que, se o dicionário não tiver uma chave igual a "XML_File", esse código gerará uma exceção. Se você deseja verificar primeiro, pode usar o TryGetValue assim:

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á fora
fonte
73

Por que não usar apenas o nome da chave no dicionário, o C # tem o seguinte:

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

Se você olhar a sugestão de dica:

insira a descrição da imagem aqui

FrenkyB
fonte
4
Emite uma exceção se a chave não existir. É por isso que as respostas de outras pessoas sugerem que você use o TryGetValue.
Ladislav Ondris
Eu acho que não, esse é o motivo.
precisa saber é o seguinte
1
O que você quer dizer?
Ladislav Ondris
1
Eu não acho que essa seja a razão pela qual outras pessoas estão sugerindo o TryGetValue. Minha solução é a simplificação, da qual eu não estava ciente. Quando eu descobri, colei aqui. E parece que muitos outros não sabiam disso também. Caso contrário, eles também podem colar esta resposta e adicionar uma exceção se a chave não existir. De qualquer forma, obrigado por avisar.
precisa saber é o seguinte
31

Não é assim que TryGetValuefunciona. Ele retorna trueou falsese a chave foi encontrada ou não e define seu outparâmetro para o valor correspondente, se a chave estiver lá.

Se você quiser verificar se a chave está lá ou não e fazer algo quando estiver faltando, precisará de algo como isto:

bool hasValue = Data_Array.TryGetValue("XML_File", out value);
if (hasValue) {
    xmlfile = value;
} else {
    // do something when the value is not there
}
dasblinkenlight
fonte
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
fonte
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
fonte
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
fonte
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
fonte
2

Aqui está um exemplo que eu uso no meu código fonte. Estou recebendo chave e valor do Dictionary do elemento 0 para o número de elementos no meu Dictionary. Então eu preencho meu array string [], que eu envio como parâmetro depois na minha função, que aceita apenas 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 isso ajude você e os outros. Esta solução também funciona com SortedDictionary.

Atenciosamente,

Ozren Sirola

Shixx
fonte
1

Eu uso um método semelhante ao dasblinkenlight em uma função para retornar um único valor de chave de um Cookie que contém uma matriz JSON carregada em um Dicionário da seguinte maneira:

    /// <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";
        }

    }

Onde "MyCookinator.Get ()" é outra função simples do Cookie, obtendo um valor geral do cookie http.

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