在字典中搜索字符串

时间:2014-09-11 09:40:25

标签: c# string linq dictionary

我有这个类Form1.cs,我创建了我的GUI,它还有一个具有以下功能的组合框:

string SelectedItemName = (string)comboBox2.SelectedItem.ToString();
Console.WriteLine(SelectedItemName);
if (comboBox2.SelectedIndex > -1)
{
    testvariabel2.GetSessionName();
}

所以我检查用户是否从ComboBox中选择了一些内容,而不是在我的其他类CTestRack.cs中调用函数GetSessionName。

Dictionary<string, Dictionary<string, string>> newDictionary = new Dictionary<string,Dictionary<string, string>>();

foreach (SectionData section  in data.Sections)
{
    var keyDictionary = new Dictionary<string, string>();
    foreach (KeyData key in section.Keys)
        keyDictionary.Add(key.KeyName.ToString(), key.Value.ToString());

    newDictionary.Add(section.SectionName.ToString(), keyDictionary);

    if (newDictionary.ContainsKey(testvariabel.SelectedItemName))
    {
        Console.WriteLine("Key: {0}, Value: {1}", keyDictionary[testvariabel.SelectedItemName]);
    }
    else Console.WriteLine("Couldn't check Selected Name");
}

这里我想检查我的Dictionary中是否存在String SelectedItemName,但我总是得到Systen.ArgumentNullException,表明我的CTestRackClass中的String SelectedItemName为NULL。

现在我的问题是,我如何在CTestRack中搜索其他类中设置的字符串 Form1?

2 个答案:

答案 0 :(得分:1)

嗯......实际上你正好看着字典!要查明字典中是否存在密钥,请使用ContainsKey

if(myDictionary.ContainsKey(myKey))
{
    //do something
}

但是,您的问题来自于null永远不是字典中的有效键(主要是因为null没有正确的哈希码)。因此,您需要确保您要查找的密钥不为空。从您的代码中,我猜testvariabel.SelectedItemName尚未设置。

此外,在使用它之前,有一种更有效的方法可以查看值是否存在。使用TryGetValue

TValue val;
if(myDictionary.TryGetValue(myKey, out val))
{
    //do something with val
}

这样你就不需要访问myDictionary [myKey]了。如果您使用ContainsKey,则实际上是两次访问相同的值。在大多数情况下成本很低,但很容易避免,所以你应该试一试。

请注意,我只回答了有关查字典的具体问题。我不能说你的代码整体的正确性。

答案 1 :(得分:0)

我发现您的代码存在两个明显的问题。

  1. 您正在检查一个字典(newDictionary)中是否存在密钥,但是尝试从另一个字典中检索密钥(keyDictionary)
  2. 即使在完全构建之前,您也会尝试查找字典中的键。在foreach循环外移动if检查。