2

LINQで単語を数える必要があります。これが私が長い文字列配列の単語を数えるために使用するコードですが、これはあまり効率的ではありません:

public static int WordCount(string haystack, string needle)
{
    if (needle == null)
    {
        return 0;
    }

    string[] source = haystack.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',', '*', '-' }, StringSplitOptions.RemoveEmptyEntries);
    var matchQuery = from word in source
        where word.ToLowerInvariant() == needle.ToLowerInvariant()
        select word;
    int count=matchQuery.Count();
    return count;
}

次のような文字列があるとします。

Geo Prism GEO 1995 GEO* - ABS #16213899 HGEO-

上記の文でGEOを見つけようとすると、ルーチンが正しいカウントを返しません。4を期待します。私のルーチンの何が問題になっていますか?

4

2 に答える 2

5

あなたのコードはほぼ正しいと思いますが、4を取得しない理由は、最後のGeoがhgeoの一部であるため、「含む」チェックを実行する必要があるためです(3ではなく4を取得することを意図していると仮定します)

var matchQuery = from word in source
    where word.ToLowerInvariant.Contains(needle.ToLowerInvariant())
    select word;

また、テキストを次のように分割すると、マイレージが向上する場合があります。

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

これはあなたのテキストをたくさんの単語に分割し、文法を無視します(テストされていませんが、うまくいくはずです)

于 2012-07-10T11:23:27.107 に答える
5

LINQを使用してワンライナーとして使用できます。

void Main()
{
    string data = "Geo Prism GEO 1995 GEO* - ABS #16213899 HGEO-";
    var target = "GEO";
    var count = data.Select((c, i) => data.Substring(i)).Count(sub => sub.ToUpper().StartsWith(target));
    Console.WriteLine(count.ToString());
}

結果:

4
于 2012-07-10T11:31:41.020 に答える