通过键获取字典的值

329

如何在函数中通过键获取字典的值?

我的函数代码(我尝试的命令不起作用):

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

我的按钮代码:

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

我希望在XML_Array函数中该变量为:

string xmlfile = "Settings.xml":

关于“我尝试的命令不起作用”:发生了什么?有什么症状? - Peter Mortensen
12个回答

443
这很简单:
String xmlfile = Data_Array["XML_File"];

请注意,如果字典中没有一个键等于"XML_File",那么该代码将会抛出异常。如果您想先检查,可以像这样使用TryGetValue:
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

152

只需在字典中使用键名称。 C#有这个功能:

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

如果你看一下提示建议:

这里输入图片描述


10
如果键不存在,它会抛出一个异常。这就是为什么其他人的答案建议使用TryGetValue的原因。 - Ladislav Ondris
1
我不认为这是其他人建议使用TryGetValue的原因。我的解决方案是简化,这是我之前不知道的。当我发现它时,我把它粘贴在这里。而且似乎很多人也不知道这个。否则,他们也可以粘贴这个答案并添加如果键不存在则抛出异常。无论如何,谢谢提醒。 - FrenkyB
1
由于某些原因,我总是在使用字典时忘记这一点……好像它不应该是这么简单的。 - Ortund
当您知道值将始终存在时,仍是一个好的解决方案。如果不确定,它仍然建议使用TryGetValue()的答案。 - Koenman
如果您的代码因为键不存在而抛出异常 - 您试图通过键从字典中“获取值”,那么您的代码可能存在潜在问题。您的键范围应该限制在字典中存在的键上。 - IamSierraCharlie

41

这不是TryGetValue的工作方式。它基于找到或未找到键而返回truefalse,如果存在该键,则设置其out参数为相应的值。

如果你想检查键是否存在并在缺失时执行某些操作,需要像这样:

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

我对 hasValue 没有用处: if (Data_Array.TryGetValue("XML_File", out value)) { xmlfile = value; } else { // 当值不存在时做一些事情 } - The incredible Jan
CS0103:在当前上下文中,名称“value”不存在 - ViktorMS
@ViktorMS 我没有在答案中添加声明来污染它。在C#6中,您可以添加“var”与声明结合使用。 - Sergey Kalinichenko

32
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'

需要解释一下。例如,什么是想法/要点?请通过编辑(更改)您的答案进行回复,而不是在评论中(不带“编辑:”,“更新:”或类似内容 - 答案应该看起来像今天写的)。 - Peter Mortensen

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

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

那怎么回答这个问题呢?“如何通过键获取字典值”?需要解释一下。例如,什么是主意/要点?请通过编辑(更改)您的答案来回复,而不是在评论中回复(不要加上“编辑:”,“更新:”或类似的内容 - 答案应该看起来像是今天写的)。 - Peter Mortensen
这是回答另一个问题的答案吗? - Peter Mortensen

4
Dictionary<int,string> dict = new Dictionary<int,string>{
  {1,"item1"},
  {2,"item2"},
  {3,"item3"},
}

int key = 2 // for example
string result = dict.ContainsKey(key) ? dict[key] : null;

2
这将在字典中搜索两次关键字。为什么不使用 TryGetValue 的 out 参数来代替第二次搜索呢?即使使用您的代码:如果您想走这条路,为什么要使用 TryGetValue 而不是 ContainsKey 呢? - BDL

3
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"];
}

需要解释一下。例如,什么是想法/主旨?有什么改变?修复了什么?请通过编辑(更改)您的答案来回应,而不是在评论中回应(不要加上“编辑:”,“更新:”或类似的内容 - 答案应该看起来像是今天写的)。 - Peter Mortensen

3

这是我在源代码中使用的一个例子。 我从我的字典中获取键(key)值(value),从0号元素到字典中元素的数量。然后,我填充我的string[]数组,将其作为参数发送到我的函数中,该函数仅接受params string[]类型的参数。

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

这个解决方案同样适用于 SortedDictionary。


2

我使用类似于dasblinkenlight的方法,在一个函数中返回一个包含在Cookie中的JSON数组加载到字典中的单个键值:

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

    }

今日免费次数已满, 请开通会员/明日再来

这里没有叫做“dasblinkenlight”的人。它指的是哪个答案? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接