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

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

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


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
}

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

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


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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.