3

私はテキスト エディターを作成しており、実際の単語数を提供する必要があります。現在、私はこの拡張メソッドを使用しています:

 public static int WordCount(this string s)
    {
        s = s.TrimEnd();
        if (String.IsNullOrEmpty(s)) return 0;
        int count = 0;
        bool lastWasWordChar = false;
        foreach (char c in s)
        {
            if (Char.IsLetterOrDigit(c) || c == '_' || c == '\'' || c == '-')
            {
                lastWasWordChar = true;
                continue;
            }
            if (lastWasWordChar)
            {
                lastWasWordChar = false;
                count++;
            }
        }
        if (!lastWasWordChar) count--;
        return count + 1;
    }

リッチテキスト ボックスのテキストに対して 10 分の 1 秒ごとに単語カウントが実行されるように設定しました (選択の開始が前回のメソッド実行時と異なる場合)。問題は、非常に長いファイルで作業すると単語カウントが遅くなることです。これを解決するために、現在の段落でのみ単語数を実行し、毎回単語数を記録し、前回単語数を実行したときの単語数と比較することを考えています。次に、2 つの単語の差を合計単語数に追加します。これを行うと、多くの複雑さが生じます (ユーザーが貼り付けた場合、ユーザーが段落を削除した場合など)。これは単語数を改善するための論理的な方法ですか? それとも、それをより良くするかについて私が知らない何かがありますか?

編集:別のスレッドでワードカウントを実行するとうまくいきますか? スレッドについてはよくわかりません。調査します。

私が使用したサンプル テキスト:

4

3 に答える 3

12

空白に基づいて、より単純な単語カウントを行うことができます。

public static int WordCount(this string s)
{
  return s.Split(new char[] {' '}, 
    StringSplitOptions.RemoveEmptyEntries).Length;
}

MSDN はこの例を提供しています。これにより、大きなファイルで正確な単語数をはるかに高速に計算できます。

于 2010-02-09T01:40:58.777 に答える
4

収縮をキャプチャするために、少なくとも1つの単語文字やアポストロフィを検索する非常に単純な正規表現を使用することもできます。

public static int WordCount(this string s) 
{
    return Regex.Matches(s, @"[\w']+").Count;
}

これにより、2141の一致が返されます(この場合、Wordは「*を指で刺すことによって」という文の単語として単一のアスタリスクをカウントするため、実際にはWordよりも正確です)。

于 2010-02-09T03:44:34.050 に答える
0

あなたの方法は実際には提案されたString.Split方法よりも高速で、x86 では約 3 倍、実際には x64 では 2 倍以上高速です。JIT がタイミングを台無しにしていると思われます。最初の実行では JIT が大部分の時間を占めるため、常にマイクロベンチマークを 2 回実行してください。また、String.SplitNGEN 化されているため、ネイティブ コードにコンパイルする必要がなく、高速に表示されます。

言うまでもなく、より正確でもあり、String.Splitここでは 7 単語をカウントします。

test : : これはテストです

それはまた理にかなっString.Splitていて、魔法を実行しません。多くの文字列の配列の作成が、文字列内の個々の文字を単純に反復するよりも高速である場合、私は非常に驚くでしょう. 文字列の foreaching は、unsafeポインター演算を試したときに明らかに高度に最適化されており、実際には単純な よりも少し遅くなりましたforeach。テキストのどのセクションに単語数が必要かを賢く考える以外に、これをより速く行う方法があるとは思えません。

于 2010-02-10T23:12:27.893 に答える