0

クリックボタンイベントで私はしました:

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

私が追加/変更した部分は次のとおりです。

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

そして、初めてテキストファイルが存在しない場合は問題ありませんが、ファイルが存在し、すでにURLとキーが内部にある場合は、次の場合に同じエラーが発生します。LocalyKeyWords [values [0]]。Clear();

エラーは次のとおりです。指定されたキーが辞書に存在しませんでした。そして、値にはインデックス[0]のURLとインデックス[1]に2つのインデックスが含まれていることがわかります。キーとLocalyKeyWordsには、値である1つのインデックスが含まれています。

では、どうすればこの問題を解決できますか?また、ボタンをクリックしなくても、コンストラクターでプログラムを実行しているときにテキストファイルをロードするにはどうすればよいですか?

コンストラクターでプログラムを実行するときにテキストファイルを1回ロードし、ボタンをクリックするときに1回ロードするようにするにはどうすればよいですか?

ありがとう。

4

1 に答える 1

1

すべての変更を失いたくない場合は、最初にファイルを読み取り、その値を辞書に保存する必要があります。また、URL の既存のキーを上書きする場合は、List毎回クリアする必要があります。例えば:

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));
            }
        }
    }
}
于 2012-10-10T06:02:57.357 に答える