Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我还是不知道';我不明白为什么我';我得到一个错误:_C# - Fatal编程技术网

C# 我还是不知道';我不明白为什么我';我得到一个错误:

C# 我还是不知道';我不明白为什么我';我得到一个错误:,c#,C#,错误是:KeyNotFoundException:字典中不存在给定的键 LocalyKeyWords是一个列表: LocalyKeyWords[values[0]].Clear(); 然而,当我读取文件时,我得到了一个异常。 我在错误行中看到,LocalyKeyWords为空0,但值包含两个索引: http://www.cnet.com,changing for test http://www.wlala.co.co,adding 索引0是url,索引1是url键 我尝试在这一行之前添加,并

错误是:
KeyNotFoundException:字典中不存在给定的键

LocalyKeyWords是一个列表:

LocalyKeyWords[values[0]].Clear();
然而,当我读取文件时,我得到了一个异常。 我在错误行中看到,
LocalyKeyWords
为空0,但值包含两个索引:

http://www.cnet.com,changing for test
http://www.wlala.co.co,adding
索引0是url,索引1是url键

我尝试在这一行之前添加,并将代码稍微更改为:

[0] http://www.cnet.com and [1] changing for test
换考是考试的关键 而艾丁是成功的关键

因此,在从文本文件读回url时,我想做两件事:

  • 要将url及其所属键添加到
    列表框
    ,我在构造函数中完成了此操作。我想在每次用户更改url的键或添加新url及其键时,在按钮单击事件中执行此操作,以便用户在列表框中实时看到更改。在构造函数中,我添加url和键,并在列表框中显示,如下所示:

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

    http://www.cnet.com,changing for test
    http://www.wlala.co.co,adding
    
  • sr是一个
    流阅读器
    。 它在构造器中运行良好。构造器中的格式相同。我想在用户添加新/更改密钥或url时,在按钮单击事件中实时显示它

  • 要修复当前处于按钮单击事件中的读取部件,请单击异常错误

  • 新的读取部件代码:

                    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();
    
    if(File.Exists(@“d:\Keywords.txt”))
    {
    string[]entries=File.ReadAllLines(@“D:\Keywords.txt”);
    foreach(条目中的字符串条目)
    {
    string[]value=entry.Split(',');
    if(LocalyKeyWords.ContainsKey(值[0]))
    LocalyKeyWords[values[0]].Clear();
    其他的
    LocalyKeyWords[values[0]]=新列表();
    for(int i=1;i

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

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

    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]);
                    }
                }
    
    if(LocalyKeyWords.ContainsKey(值[0]))
    LocalyKeyWords[values[0]].Clear();
    其他的
    LocalyKeyWords[values[0]]=新列表();
    
    试着阅读,上面写着:

    如果找不到指定的键,get操作将抛出 KeyNotFoundException,一个set操作创建一个具有 指定的密钥


    这样做是否解决了问题:

    if(LocalyKeyWords.ContainsKey(values[0]))
        LocalyKeyWords[values[0]].Clear();
    else
        LocalyKeyWords[values[0]] = new List<string>();
    
    或者,如果可以重新分配
    LocalyKeyWords
    ,则可以执行以下操作:

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

    后一种方法更可取,因为它是完全重建字典,因此不可能存在现有的键。

    Konstantin我在这里尝试了你的代码。在我的问题中,我更新了读取文件部分的升级代码。但现在每次我单击按钮,它都会创建一个新的空文本文件,我不希望它被删除我想让旧的文本文件被保存,而不是每次单击按钮时创建一个新的文本文件。@丹尼利普考虑使用<代码>新StreamWriter(“文件路径”,true)
    constructor@DanielLipKonstantin我知道这是真的,但这样做会继续在新行中添加url/键,其想法是,在编写区号时,如果我更改为新url并为其放置键,它会将新url及其键添加到列表中,如果我将url更改回列表中已存在的旧url并更改为url是否将其旧键转换为新键,以便用新键替换新键。将StreamWriter设置为true,使其不会发生,而只是将旧url和旧键添加为新行。@DanielLip你不认为这应该是一个单独的问题吗?谜性它并没有解决问题,即当我关闭程序时,再次运行该程序并执行cli勾选按钮以添加/更改url/键,以便创建新文本文件,而不是将其更改/添加到现有文本文件。
    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]);
                    }
                }
    
    if(LocalyKeyWords.ContainsKey(values[0]))
        LocalyKeyWords[values[0]].Clear();
    else
        LocalyKeyWords[values[0]] = new List<string>();
    
    foreach (string entry in entries)
    {
        string[] values = entry.Split(',');
        LocalyKeyWords[values.First()] = values.Skip(1).ToList();
    }
    
    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);