1

我有超过 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

我怎样才能以最快的方式做到这一点?

4

4 回答 4

5

GroupBy方法就是你想要的。您需要将您的字符串放在列表或实现的东西中IEnumerable<string>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()))
    ...
于 2012-01-12T11:16:36.190 回答
3

你可以使用 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
}
于 2012-01-12T11:29:28.623 回答
2

另一种“老派”方法是迭代所有行并将它们添加到字典中(如果还没有的话)。关键是行,值是计数。

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);

优点是,它也适用于早期的框架版本。

于 2012-01-12T11:29:22.573 回答
2

你可以试试这个:


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()));

于 2012-01-12T11:30:02.833 回答