using System.Collections.Generic;
public static void Main()
string input = "(5x: 37/116/304ms)PAGEIOLATCH_SH:tempdb:12(*), (2x: 52/70ms)PAGEIOLATCH_SH:tempdb:11(*), (2x: 60/100ms)PAGEIOLATCH_SH:tempdb:17(*), (2x: 14/59ms)PAGEIOLATCH_SH:tempdb:4(*), (2x: 18/42ms)PAGEIOLATCH_SH:tempdb:5(*), (1x: 15ms)CXCONSUMER, (1x: 38ms)PAGEIOLATCH_SH:tempdb:13(*), (1x: 60ms)PAGEIOLATCH_SH:tempdb:14(*), (1x: 65ms)PAGEIOLATCH_SH:tempdb:15(*)";
public static void PrintHistogram(string input)
var lines = CreateHistogram(input);
lines.ForEach(l => Console.WriteLine(l));
public static List<string> CreateHistogram(string input)
.Select(rl => new { Count = GetCount(rl), Key = GetKey(rl) } )
.GroupBy(x => x.Key, x => x.Count, (key, count) => new { Key=key, Count = count.Sum() })
.Select(g => $"{g.Count}x {g.Key}")
public static int GetCount(string input)
return int.Parse(input.Substring(1, input.IndexOf('x')-1));
public static string GetKey(string input)
int start = input.IndexOf(')')+1;
int len = input.LastIndexOf(':') - start;
len = len < 0 ? input.Length - start : len;
return input.Substring(start, len);