2012-04-28 31 views
2

これは、CSVファイルを読み込み、その値を辞書クラスに追加し、テキストボックス内の文字列を分析して、その単語のどれかが辞書エントリと一致するかどうかを調べるプログラムです。略語(LOL、ROFLなど)を実際の言葉に置き換えます。入力されたテキストを個々の単語に分割して文字列を照合します。文字列の連結/上書き?

public void btnanalyze_Click(object sender, EventArgs e) 
    { 
     var abbrev = new Dictionary<string, string>(); 
     using (StreamReader reader = new StreamReader("C:/Users/Jordan Moffat/Desktop/coursework/textwords0.csv")) 
     { 
      string line; 
      string[] row; 

      while ((line = reader.ReadLine()) != null) 
      { 
       row = line.Split(','); 

       abbrev.Add(row[0], row[1]); 
       Console.WriteLine(abbrev); 
      } 
     } 


     string twitterinput; 
     twitterinput = ""; 
     // string output; 
     twitterinput = txtInput.Text; 
     { 
      char[] delimiterChars = { ' ', ',', '.', ':', '\t' }; 

      string text = twitterinput; 

      string[] words = twitterinput.Split(delimiterChars); 


     string merge; 
      foreach (string s in words) 
      { 
       if (abbrev.ContainsKey(s)) 
       { 
        string value = abbrev[s]; 


        merge = string.Join(" ", value); 
       } 

        if (!abbrev.ContainsKey(s)) 
        { 
         string not = s; 
         merge = string.Join(" ", not); 
        } 

         ; 
         MessageBox.Show(merge); 

       } 

これまでの問題は、最終的な文字列がテキストボックスに出力されていることですが、それは上書きとしてのみ最後の単語を印刷します。これは大学の割り当てなので、私は実際の答えではなく正しい方向へのプッシュを探しています。どうもありがとう!

+0

、それはしかし、結果にスペースを追加しないでしょう。 – svick

+0

私は確かに分かっていませんが、デバッガでループを進めてみましたか?私はそれが正しいように見える前にすべてを考えるので、ループがあなたの問題である可能性が最も高いです。 – sebsebmc

答えて

0

これが問題である:

string not = s; 
merge = string.Join(" ", not); 

あなただけのため、あなたが以前にmergeに入れて何を上書きし、スペース区切り文字で(最新)の単一の要素に参加しています。

文字列をスティックしたい場合は、新しい単語を出力に追加するにはConcatを使用する必要がありますが、毎回文字列を再作成するほど遅くなります。出力を作成するにはStringBuilderを使用する方が効率的です。

Joinを使用して出力をビルドする必要がある場合は、wordsアレイ内のターゲットワードをループして置き換える必要があります。しかし、そのためにはループバックする配列を変更できないので、foreach以外のループ機構を使用する必要があります。

+0

これは実際にスペースに参加していないし、 's'で、スペースをセパレータとして使用しています。あなたが書いているのは 'String.Concat()'でしょう。 – svick

+0

@svick - 私は知っています - それはひどく言われています。私はそれを修正しました。 – ChrisF

2

string.Join()は、文字列のコレクションを取り、それらを連結して結果を返します。しかし、あなたの場合、コレクションには1つのアイテム、value、またはnotが含まれています。文字列は、仕事のやり方で、これは非常に遅くなりますので、あなたが代わりにStringBuilderを使用する必要がありますので、

merge = string.Join(" ", merge, value); 

しかし:

はあなたのようなものを使用することができ、あなたのコードの作業を行います。 L.B @

+0

Slowは当分の間うまくいくので、私はそれを与えて、次に動作させたら 'code'StringBuilder'code'を試みます。乾杯! –

+0

joinを使っているのと同じくらい良いことは、彼の割り当ての全体的なアイデアに反してしまうと思います。 –

+0

@JeffMercado、私はなぜそれが割り当ての考えに逆らっているのか分かりません。 – svick