2011-07-19 14 views
0

申し訳ありませんが、私は一生懸命に見てきましたが、私の問題に対する答えを見つけることができませんでした。私のコードに問題がなければならないし、誰かが私のためにそれを見ることができれば本当に役に立ちます。cで辞書に追加する際の問題#

 Dictionary<string, string> keylist = new Dictionary<string, string>(); 
      if (intext.Contains("addkey") && intext.Contains("def")) 
     { 

      string[] keywords = intext.Split(' '); 
      string key1 = keywords[1]; 
      string def2 = keywords[3]; 
      string fkey = key1.Replace("_", " "); 
      string fdef = def2.Replace("_", " "); 
      keylist.Add(fkey, fdef); 
      say("Phrase '" + fkey + "' added with response '" + fdef + "'"); 
      say("Your Dictionary contains " + keylist.Count.ToString() + " word(s)."); 
      ////////////////////////////// 



     } 

私はそれがやりたいすべては「ADDKEY key_here DEF definition_here」の形式で入力を取ると辞書に追加しています。デバッグの目的でカウント部分を追加しました。追加した数にかかわらず、辞書に1語しかありません。あなたはおそらく私が新しいと言うことができるので、優しくしてください。おかげ

+2

コードは一度だけ実行されるため、辞書内には1つの要素しかありません。 –

+0

私は見ることができるから、あなたは新しい辞書に1組だけ追加している、私はそれに1項目を持っていることを期待するだろう。 –

+0

おそらく、達成しようとしていることを説明する方が良いかもしれません。理解していないかもしれない辞書の使用にはいくつか問題があります。 –

答えて

1
Dictionary<string, string> keylist = new Dictionary<string, string>(); 

は、私は、ユーザーが(例えば、コマンドラインから、彼らはボタンをクリックしたときなど)コマンドのいくつかの並べ替えに入るたびに、この関数が呼び出されると仮定しています。このような場合は、keylistディクショナリをより高いレベル(インスタンス変数など)にする必要があります。コードが今のように、関数が呼び出されるたびに新しい辞書が作成され、キーが追加されます。これが理由だけです。

問題を誤って判断しすぎたり、単純すぎると、上で引用した行を関数本体の外に移動するだけで効果的です。

+0

+1 11秒:) –

+0

ありがとう、それは完璧に動作します。それは質問に答えるための記録的な時間でなければなりません。私はそれを見ていないとは信じられません。 – oakley

+0

@oakley:それはあなたのために働いてうれしい!これで問題が解決した場合は、似たような問題を抱えている他の人が簡単に解決策を見つけることができるように、それを受け入れられた回答としてマークすることを忘れないでください。 –

1

コードでは、実行するたびに辞書を再作成しています。

Dictionary<string, string> keylist = new Dictionary<string, string>(); 

変数キーリストを空の辞書に再初期化します。

代わりにその行を関数外に移動してみてください。あなたはリサイズを使用しているので、あなたはクラスレベルの変数を作成することができ、このような何か:

public partial class Form1 : Form 
{ 
    Dictionary<string, string> keylist = new Dictionary<string, string>();  

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public void YourFunction(string intext) 
    { 
     if (intext.Contains("addkey") && intext.Contains("def"))   
     {    
      string[] keywords = intext.Split(' ');    
      string key1 = keywords[1];    
      string def2 = keywords[3];    
      string fkey = key1.Replace("_", " ");    
      string fdef = def2.Replace("_", " ");    
      keylist.Add(fkey, fdef);    
      say("Phrase '" + fkey + "' added with response '" + fdef + "'");    
      say("Your Dictionary contains " + keylist.Count.ToString() + " word(s)."); 
     } 
    } 

} 
0

あなたはif (intext.Contains...{}ブロックをループする必要があるか、それは一度だけ実行されます。

while(true) { 
    Dictionary<string, string> keylist = new Dictionary<string,string>(); 
    //... 
} 

それはあなただのであれば、あなたは、外でそれを移動する必要があります:あなたはそれをループして唯一の辞書内の1つのエントリを取得している場合は、次のようなシナリオで範囲内でそれを再割り当てておくので、それはです場合。

0

私はあなたの入力文字列があるまさにか、私はあなたがこの線に沿って入力文字列とループを分割するために探していると思いますけれども、あなたが、それを使用する必要があるかわからないんだけど...

private Dictionary<string, string> GetData(string intext) 
{ 
    Dictionary<string, string> keylist = new Dictionary<string, string>(); 

    string[] keywords = intext.Split(' '); 
    foreach (string s in keywords) 
    { 
     if (s.Contains("addkey") && s.Contains("def")) 
     { 
      string fkey = key1.Replace("_", " "); 
      string fdef = def2.Replace("_", " "); 

      keylist.Add(fkey, fdef); 
      say("Phrase '" + fkey + "' added with response '" + fdef + "'"); 
      say("Your Dictionary contains " + keylist.Count.ToString() + " word(s)."); 
     } 
    } 

    return keylist; 
} 
関連する問題