2012-01-26 8 views
0

これはC#Linqを使って行うことができますか?例えばテキスト内の単語の出現数を取得

:私ができる

peter 3 
peppers 2 
picked 1 
... 

ピーターパイパーは、漬け唐辛子のパックを選んだピーマンはピーターのために甘いと種まきした、ピーターは結果

を考えました入れ子にされたforループでそれを行いますが、Linqを使用してより簡潔で、リソースの光の方法があると考えていました。

答えて

6

あなたはGROUPBYを使用することができます。

string original = "peter piper picked a pack of pickled peppers, the peppers were sweet and sower for peter, peter thought"; 

var words = original.Split(new[] {' ',','}, StringSplitOptions.RemoveEmptyEntries); 
var groups = words.GroupBy(w => w); 

foreach(var item in groups) 
    Console.WriteLine("Word {0}: {1}", item.Key, item.Count()); 
1
"peter piper picked a pack of pickled peppers,the peppers 
were sweet and sower for peter, peter thought" 
.Split(' ', ',').Count(x=>x == "peter"); 

「ピーター」のためのもので、他の人と同じ繰り返しです。

4

これはトリックを行う必要があります。

var str = "peter piper picked a pack of pickled peppers, the peppers were sweet and sower for peter, peter thought"; 
var counts = str 
    .Split(' ', ',') 
    .GroupBy(s => s) 
    .ToDictionary(g => g.Key, g => g.Count()); 

今辞書countsがあなたの文章から単語カウントのペアが含まれています。例えば、counts["peter"]は、私はそれがより効率的か、 "リソース光" だかどうかわからないんだけど、あなたが行うことができます。3.

+0

'Regex.Split(str、@" \ W ")。GroupBy ...'を使って、単語分割を簡略化することができます。収縮は気になるので、おそらく '[。、;:!?" "\ s-]'なんかかな。 – user7116

+1

元の文字列に "、"セクションがあるので、これを指定すると 'string.Empty'のカウントが得られます... –

+0

@ReedCopsey OPはループで実行できると言うので、私はほとんど確信しています彼はSplit(...)の呼び出しの後でその部分を探していると言っています。空の文字列に言及してくれてありがとう! – dasblinkenlight

1

です:

string[] words = "peter piper picked a pack of pickled peppers, the peppers were sweet and sower for peter, peter thought".Split(" "); 
int peter = words.Count(x=>x == "peter"); 
int peppers = words.Count(x=>x == "peppers"); 
// etc 
0
const string s = "peter piper picked a pack of pickled peppers, the peppers were sweet and sower for peter, peter thought"; 

var wordFrequency = 
     from word in s.Split(' ') 
     group word by word 
     into wordGrouping 
     select new {wordGrouping.Key, Count = wordGrouping.Count()}; 
関連する問題