-2
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

それでも、ファイルを読み取ると、例外が発生します。LocalyKeyWords0が空であるが、値に2つのインデックスが含まれているエラー行が表示されます。

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

インデックス0はURLで、インデックス1はURLキーです。

この行の前に追加して、コードを次のように少し変更しようとしました。

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

しかし、それは機能せず、問題を解決しませんでした。まだ回線にエラーがあります。どうすれば修正できますか?

リストは次のように作成されます:url、key for exmaple:http ://www.google.com "、" googleまた、テキストファイル形式は次のようになります。

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

テスト用に変更することはhttp://www.cnet.comの鍵であり 、アドインはhttp://www.wlala.co.coの鍵です

したがって、テキストファイルからurl、keyを読み戻すときに、2つのことを実行したいと思います。

  1. URLとそれに属するキーをに追加するListBoxために、コンストラクターでそれを行いました。ユーザーがURLのキーを変更するか、新しいURLとそのキーを追加するたびに、ボタンクリックイベントでこれを実行して、ユーザーがListBoxで変更をリアルタイムで確認できるようにします。コンストラクターで、URLとキーを追加し、次のようにリストボックスに表示します。

    sr = new StreamReader(@ "d:\ Keyboards.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/秒の変更時にボタンクリックイベントでリアルタイムに表示したい

  1. 読み取り部分を、例外エラーのあるボタンクリックイベントにあるように修正するには。

新しい読み取りパーツコード:

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]);
                }
            }

ユーザーがファイルを削除した場合に備えて、ファイルが存在するかどうかのチェックも追加されました。しかし、ファイルが存在する場合、ユーザーがボタンをクリックするたびに新しい空のテキストファイルが作成されることは望ましくありません。

4

2 に答える 2

1

辞書に鍵がありません。キーが辞書に存在するかどうかを確認してから、クリアしてみてください。さらに、キーが辞書にない場合は、それをクリアする必要はありません。次に、キーを辞書に追加する必要があります。

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

Dictionary.Itemプロパティを読んでみてください。

指定されたキーが見つからない場合、get操作はKeyNotFoundExceptionをスローし、set操作は指定されたキーを使用して新しい要素を作成します。

于 2012-10-11T00:23:54.020 に答える
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);

後者の方法は、辞書を完全に再構築するため、既存のキーが存在する可能性がないため、推奨されます。

于 2012-10-11T00:51:14.957 に答える