私は60万行以上の文字列を持っています。同じ文字列をグループ化し、そのカウントを学習したい。
その例
i go to school
i like music
i like games
i like music
i like music
i like games
i like music
したがって、結果は
i go to school , 1
i like games , 2
i like music , 4
可能な限り最速の方法でそれを行うにはどうすればよいですか?
私は60万行以上の文字列を持っています。同じ文字列をグループ化し、そのカウントを学習したい。
その例
i go to school
i like music
i like games
i like music
i like music
i like games
i like music
したがって、結果は
i go to school , 1
i like games , 2
i like music , 4
可能な限り最速の方法でそれを行うにはどうすればよいですか?
メソッドはあなたGroupBy
が望むものです。文字列をリストまたは実装するものにする必要がありますIEnumerable<string>
。支出者が提案したは、ファイルを 1 行File.ReadLines
ずつ読み取る を返します。IEnumerable<string>
var stringGroups = File.ReadLines("filename.txt").GroupBy(s => s);
foreach (var stringGroup in stringGroups)
Console.WriteLine("{0} , {1}", stringGroup.Key, stringGroup.Count());
(あなたの例のように)最小から最大の順に並べたい場合は、OrderBy
...
foreach (var stringGroup in stringGroups.OrderBy(g => g.Count()))
...
Linqを使用して実装できます
IEnumerable<string> stringSource = File.ReadLines("C:\\file.txt");
var result = stringSource
.GroupBy(str => str)
.Select(group => new {Value = group.Key, Count = group.Count()})
.OrderBy(item => item.Count)
.ToList();
foreach(var item in result)
{
// item.Value - string value
// item.Count - count
}
もう1つの「オールドスクール」アプローチは、すべての行を繰り返し、それらをDictioaryに追加することです(まだ存在しない場合)。キーは行であり、値はカウントです。
var d = new Dictionary<string, Int32>();
foreach (var line in File.ReadAllLines(@"C:\Temp\FileName.txt"))
if (d.ContainsKey(line)) d[line]++; else d.Add(line, 1);
利点は、以前のフレームワークバージョンでも機能することです。
あなたはこれを試すことができます:
var groupedLines = System.IO.File.ReadAllLines(@"C:\temp\samplelines.txt").GroupBy(x=>x);
groupedLines.ToList().ForEach(y => Console.WriteLine("Content: {0} - Occurences: {1}", y.Key, y.Count()));