Contando palabras en una colección usando LINQ

Tengo un objeto StringCollection con 5 palabras en ellos. 3 de ellas son palabras duplicadas. Estoy tratando de crear una consulta LINQ que contará cuántas palabras únicas hay en la colección y las enviará a la consola. Entonces, por ejemplo, si mi StringCollection tiene ‘House’, ‘Car’, ‘House’, ‘Dog’, ‘Cat’, entonces debería salir así:

 Casa -> 2
 Coche -> 1
 Perro -> 1
 Gato -> 1

¿Alguna idea sobre cómo crear una consulta LINQ para hacer esto?

Intenta lo siguiente

var res = from word in col.Cast() group word by word into g select new { Word = g.Key, Count = g.Count() }; 
 var xs = new StringCollection { "House", "Car", "House", "Dog", "Cat" }; foreach (var g in xs.Cast() .GroupBy(x => x, StringComparer.CurrentCultureIgnoreCase)) { Console.WriteLine("{0}: {1}", g.Key, g.Count()); } 

Dado que está utilizando StringCollection y desea ignorar mayúsculas y minúsculas, deberá usar Enumerable.GroupBy con Enumerable.Cast :

 var results = collection.Cast.GroupBy( i => i, (word, words) => new { Word = word, Count = words.Count() }, StringComparer.CurrentCultureIgnoreCase ); foreach(var wordPair in results) Console.WriteLine("Word: \"{0}\" - Count: {1}", wordPair.Word, wordPair.Count); 

Para construir un solo resultado de valor de cadena …

 var stringCollection = new[] { "House", "Car", "house", "Dog", "Cat" }; var result = stringCollection.Cast().GroupBy( k => k, StringComparer.InvariantCultureIgnoreCase) .Select(v => v.Key + " -->" + v.Count()) .Aggregate((l,r)=>l+" " + r); //result = "House -->2 Car -->1 Dog -->1 Cat -->1" 

Para poner cada valor en una línea diferente …

 var stringCollection = new[] { "House", "Car", "house", "Dog", "Cat" }; var result = stringCollection.Cast().GroupBy( k => k, StringComparer.InvariantCultureIgnoreCase); foreach (var value in result) Console.WriteLine("{0} --> {1}", value.Key, value.Count()); 
 foreach(var g in input.GroupBy(i => i.ToLower()).Select(i => new {Word = i.Key, Count = i.Count()}) { Console.WriteLine(string.Format("{0} -> {1}", g.Word, g.Count)); } 

Debería ser tan simple como:

 Console.WriteLine(stringCollection.Distinct().Count()); 
 var query = from s in Collection group s by s.Description into g select new {word = g.Key, num = g.Count()};