3

次のコードを使用して、文字列が最初に保持していた単語で構成される string[] に文字列を分割しようとしています。

    private string[] ConvertWordsFromFile(String NewFileText)
    {
        char[] delimiterChars = { ' ', ',', '.', ':', '/', '|', '<' , '>','/','@','#','$','%','^','&','*','"','(',')',';'};       
        string[] words = NewFileText.Split(delimiterChars);
        return words;


    }

次に、これを使用して、単語キーとその頻度値に対応する辞書に単語を追加します。他のすべての重複した単語はキーとして追加されず、値のみが影響を受けます。ただし、最後の単語は別の単語としてカウントされるため、新しいキーが作成されます。どうすればこれを修正できますか?

これは、単語を辞書に追加するためのコードです。

public void AddWord(String newWord)
    {
       newWord = newWord.ToLower();
        try
        {
            MyWords.Add(newWord, 1);
        }
        catch (ArgumentException)
        {
            MyWords[newWord]++;
        }

    }

私が抱えている問題を明確にするために、文字列の末尾にある単語が重複していても、それは新しい単語として扱われるため、新しい文字列として扱われます。

4

2 に答える 2

6

ランダムな推測 - 最後のスペースは、予期しない空の単語になります。はいの場合 - Splitに正しいオプションを使用します。

var words = newFileText.Split(delimiterChars,
   StringSplitOptions.RemoveEmptyEntries);
于 2012-11-09T03:30:10.947 に答える
2

分割は、この種の問題が発生しなくなり、すべての区切り記号などを指定する必要があるため、やりたいことを行うための最良の選択ではありません.

次のように、ConvertWordsFromFile メソッドの代わりに正規表現を使用することをお勧めします。

Regex.Split(theTextToBeSplitted, @"\W+")

この行は、すべての「単語」を含む配列を返します。それができたら、次のステップは辞書を作成することです。コードでlinqを使用できる場合、必要なことを行う最も簡単でクリーンな方法は次のとおりです。

var theTextToBeSplitted = "#Hi, this is a 'little' test: <I hope it is useful>";
var myDictionary = Regex.Split(theTextToBeSplitted, @"\W+")
                        .GroupBy(x => x)
                        .ToDictionary(x => x.Key, x => x.Count());

必要なのはそれだけです。

幸運を!

于 2012-11-09T04:21:17.983 に答える