using System;
using System.Linq ;
using System.Text ;
using System.Collections .Generic ;
public class Test
{
public static void Main( )
{
Random rnd = new Random( 123 ) ;
StringBuilder sb = new StringBuilder( ) ;
string text = sb.ToString ( ) ;
for ( int i = 0 ; i < 1000000 ; i++ ) sb.Append ( ( char ) ( rnd.Next ( 26 ) + 63 ) ) ;
text = sb.ToString ( ) ;
double start, linqtime, dictionarytime;
start = System.DateTime .Now .Ticks ;
var linq = text.GroupBy ( c => c) ;
foreach ( var a in linq)
{
Console.WriteLine ( "{0} = {1}" , a.Key , a.Count ( ) ) ;
}
linqtime = System.DateTime .Now .Ticks - start;
start = System.DateTime .Now .Ticks ;
Dictionary< char , int> counts = new Dictionary< char , int> ( ) ;
for ( int i = 0 ; i < text.Length ; i++ )
if ( counts.ContainsKey ( text[ i] ) )
counts[ text[ i] ] ++;
else
counts.Add ( text[ i] , 1 ) ;
foreach ( var count in counts)
Console.WriteLine ( "{0} = {1}" , count.Key , count.Value ) ;
dictionarytime = System.DateTime .Now .Ticks - start;
Console.WriteLine ( "LINQ time : {1}\n Dictionary time : {2}\n LINQ is {0}% quicker" , dictionarytime/ linqtime * 100 - 100 , linqtime, dictionarytime) ;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLlRleHQ7CnVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwoKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCQlSYW5kb20gcm5kID0gbmV3IFJhbmRvbSgxMjMpOwoKCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CgoKCgkJCXN0cmluZyB0ZXh0ID0gc2IuVG9TdHJpbmcoKTsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDAwOyBpKyspIHNiLkFwcGVuZCgoY2hhcikocm5kLk5leHQoMjYpICsgNjMpKTsKCQkJdGV4dCA9IHNiLlRvU3RyaW5nKCk7CgoJCQlkb3VibGUgc3RhcnQsIGxpbnF0aW1lLCBkaWN0aW9uYXJ5dGltZTsKCgkJCXN0YXJ0ID0gU3lzdGVtLkRhdGVUaW1lLk5vdy5UaWNrczsKCQkJdmFyIGxpbnEgPSB0ZXh0Lkdyb3VwQnkoYyA9PiBjKTsKCgkJCWZvcmVhY2ggKHZhciBhIGluIGxpbnEpCgkJCXsKCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ7MH0gPSB7MX0iLCBhLktleSwgYS5Db3VudCgpKTsJCQkKCQkJfQoJCQlsaW5xdGltZSA9IFN5c3RlbS5EYXRlVGltZS5Ob3cuVGlja3MgLSBzdGFydDsKCgoJCQlzdGFydCA9IFN5c3RlbS5EYXRlVGltZS5Ob3cuVGlja3M7CgkJCURpY3Rpb25hcnk8Y2hhciwgaW50PiBjb3VudHMgPSBuZXcgRGljdGlvbmFyeTxjaGFyLCBpbnQ+KCk7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5MZW5ndGg7IGkrKykKCQkJCWlmIChjb3VudHMuQ29udGFpbnNLZXkodGV4dFtpXSkpCgkJCQkJY291bnRzW3RleHRbaV1dKys7CgkJCQllbHNlCgkJCQkJY291bnRzLkFkZCh0ZXh0W2ldLCAxKTsKCgkJCWZvcmVhY2ggKHZhciBjb3VudCBpbiBjb3VudHMpCgkJCQlDb25zb2xlLldyaXRlTGluZSgiezB9ID0gezF9IiwgY291bnQuS2V5LCBjb3VudC5WYWx1ZSk7CgoJCQlkaWN0aW9uYXJ5dGltZSA9IFN5c3RlbS5EYXRlVGltZS5Ob3cuVGlja3MgLSBzdGFydDsKCQkJCgkJCUNvbnNvbGUuV3JpdGVMaW5lKCJMSU5RIHRpbWUgOiB7MX1cbkRpY3Rpb25hcnkgdGltZSA6IHsyfVxuTElOUSBpcyB7MH0lIHF1aWNrZXIiICwgZGljdGlvbmFyeXRpbWUvbGlucXRpbWUgKiAxMDAgLSAxMDAsIGxpbnF0aW1lLCBkaWN0aW9uYXJ5dGltZSk7Cgl9Cn0=