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键时做两件事:
要将网址及其归属键添加到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();
sr是StreamReader
。
它在构造函数中运行良好。构造函数中的格式相同。我想在用户添加新/更改键/ url / s时在按钮单击事件中实时显示它
新的阅读部分代码:
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]);
}
}
还添加了检查文件是否存在以防用户删除它的情况。但是如果文件存在,我不希望每次用户点击按钮时都会创建一个新的空文本文件。
答案 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);
后一种方法更可取,因为它完全重建字典,因此无法存在现有密钥。