我仍然不明白为什么我收到错误:

时间:2012-10-11 00:21:44

标签: c#

private void button6_Click(object sender, EventArgs e)
        {
          string[] entries = File.ReadAllLines(@"D:\Keywords.txt");
            foreach (string entry in entries)
            {
                string[] values = entry.Split(',');
                LocalyKeyWords[values[0]].Clear();
                for (int i = 1; i < values.Length; i++)
                    LocalyKeyWords[values[0]].Add(values[i]);
            }
            using (var w = new StreamWriter(@"D:\Keywords.txt"))
            {
                crawlLocaly1 = new CrawlLocaly();
                crawlLocaly1.StartPosition = FormStartPosition.CenterParent;
                DialogResult dr = crawlLocaly1.ShowDialog(this);
                if (dr == DialogResult.OK)
                {
                    if (LocalyKeyWords.ContainsKey(mainUrl))
                    {
                        LocalyKeyWords[mainUrl].Clear();
                        //probably you could skip this part and create new List everytime
                        LocalyKeyWords[mainUrl].Add(crawlLocaly1.getText());
                    }
                    else
                    {
                        LocalyKeyWords[mainUrl] = new List<string>();
                        LocalyKeyWords[mainUrl].Add(crawlLocaly1.getText());
                    }
                    foreach (KeyValuePair<string, List<string>> kvp in LocalyKeyWords)
                    {
                        w.WriteLine(kvp.Key + "," + string.Join(",", kvp.Value));
                    }
                }
            } 
        }

错误在线:

LocalyKeyWords[values[0]].Clear();

错误是:KeyNotFoundException: The given key was not present in the dictionary

LocalyKeyWords是一个列表:

Dictionary<string, List<string>> LocalyKeyWords = new Dictionary<string, List<string>>();

现在文件Keywords.txt不为空:

http://www.cnet.com,changing for test
http://www.wlala.co.co,adding

然而,在阅读文件时,我得到了例外。 我在错误行看到LocalyKeyWords为空0但值包含两个索引:

[0] http://www.cnet.com and [1] changing for test

索引0是网址,索引1是网址密钥!

我尝试在此行之前添加并将代码更改为:

if (LocalyKeyWords.Count == 0)
   {                         
    LocalyKeyWords[values[0]] = new List<string>();
   }
   else
   {
    LocalyKeyWords[values[0]].Clear();
   } 

但它没有用,也没有解决问题。我仍然在线上得到错误。 我该如何解决?

列表以这种方式构建:网址,例如:http://www.google.com“,”google 文本文件格式也是如此:

http://www.cnet.com,changing for test
http://www.wlala.co.co,adding

更改测试是http://www.cnet.com的关键 和addin是http://www.wlala.co.co

的关键

所以我想在回读文本文件中的url键时做两件事:

  1. 要将网址及其归属键添加到ListBox,我就在构造函数中完成了。每次用户更改网址的密钥或添加新网址及其密钥时,我都希望在按钮点击事件中执行此操作,以便用户实时查看ListBox中的更改。在构造函数中,我添加了url和键,并在ListBox中显示它,如下所示:

    sr = new StreamReader(@“d:\ keywords.txt”);                 while(null!=(line = sr.ReadLine()))                 {

                    index = line.IndexOf(",");
                    key_of_each_line = line.Substring(0, index);
                    value_of_each_key = line.Substring(index + 1);
                    listBox1.Items.Add("Url: " + key_of_each_line + " --- " + "Key: " + value_of_each_key );
                }
                sr.Close();
    
  2. sr是StreamReader。 它在构造函数中运行良好。构造函数中的格式相同。我想在用户添加新/更改键/ url / s时在按钮单击事件中实时显示它

    1. 要修复现在处于按钮单击事件中的读取部分,并出现异常错误。

    2. 新的阅读部分代码:

      if (File.Exists(@"d:\Keywords.txt"))
                  {
                      string[] entries = File.ReadAllLines(@"D:\Keywords.txt");
                      foreach (string entry in entries)
                      {
                          string[] values = entry.Split(',');
                          if (LocalyKeyWords.ContainsKey(values[0]))
                              LocalyKeyWords[values[0]].Clear();
                          else
                              LocalyKeyWords[values[0]] = new List<string>();
                          for (int i = 1; i < values.Length; i++)
                              LocalyKeyWords[values[0]].Add(values[i]);
                      }
                  }
      

      还添加了检查文件是否存在以防用户删除它的情况。但是如果文件存在,我不希望每次用户点击按钮时都会创建一个新的空文本文件。

2 个答案:

答案 0 :(得分:1)

你的字典中没有密钥。尝试检查字典中是否存在密钥,然后将其清除。此外,如果密钥不在字典中,您不需要清除它。然后你必须将密钥添加到字典中。:

if(LocalyKeyWords.ContainsKey(values[0]))
    LocalyKeyWords[values[0]].Clear();
else
    LocalyKeyWords[values[0]] = new List<string>();

尝试阅读Dictionary.Item Property,其中说:

  

如果找不到指定的键,则get操作会抛出一个   KeyNotFoundException和set操作创建一个新元素   指定的密钥。

答案 1 :(得分:1)

这样做是否解决了这个问题:

foreach (string entry in entries)
{
    string[] values = entry.Split(',');
    LocalyKeyWords[values.First()] = values.Skip(1).ToList();
}

或者,如果您可以重新分配LocalyKeyWords,则可以执行此操作:

var LocalyKeyWords =
    File
        .ReadAllLines(@"D:\Keywords.txt")
        .Select(entry =>
        {
            var values = entry.Split(',');
            return new
            {
                key = values.First(),
                values = values.Skip(1).ToList(),
            };
        })
        .ToDictionary(kv => kv.key, kv => kv.values);

后一种方法更可取,因为它完全重建字典,因此无法存在现有密钥。