Считать одинаковые строки из массивного списка строк - PullRequest
1 голос
/ 12 января 2012

У меня более 600 тысяч строк.Я хочу сгруппировать одинаковые строки и узнать их количество.

Пример:

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 ]

5 голосов
/ 12 января 2012

Метод GroupBy - это то, что вам нужно. Вам нужно, чтобы ваши строки были в списке или что-то, что реализует IEnumerable<string>. File.ReadLines, предложенный spender, вернет 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()))
    ...
3 голосов
/ 12 января 2012

Вы можете использовать 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
}
2 голосов
/ 12 января 2012

Вы можете попробовать это:

<code>
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()));</p>

<p>
2 голосов
/ 12 января 2012

Другой, "oldschool" подход заключается в переборе всех строк и добавлении их в словарь (если его еще нет). Ключ - это строка, а значение - количество.

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

Преимущество в том, что оно работает и в более ранних версиях фреймворка.

...