2010-06-11 37 views
7

Tengo un objeto StringCollection con 5 palabras en ellas. 3 de ellos son palabras duplicadas. Intento crear una consulta LINQ que cuente cuántas palabras únicas hay en la colección y las envíe a la consola. Así, por ejemplo, si mi StringCollection tiene 'House', 'Car', 'House', 'perro', 'Gato', entonces debe ser la salida como esta:Contando palabras en una colección usando LINQ

 
House --> 2 
Car --> 1 
Dog --> 1 
Cat --> 1 

Cualquier ideas sobre cómo crear una Consulta LINQ para hacer esto?

+0

¿Cómo quieres manejar carcasa? –

+0

Ignorar caso. Cat y cat deben tratarse como la misma palabra – Icemanind

+0

Todas sus respuestas son geniales, excepto que no parece tener un método .GroupBy. Tenga en cuenta que estoy usando un objeto System.Collections.Specialized.StringCollection para almacenar las cadenas, no una matriz de cadenas. – Icemanind

Respuesta

11

intente lo siguiente

var res = from word in col.Cast<string>() 
      group word by word into g 
      select new { Word = g.Key, Count = g.Count() }; 
+2

+1 Pero esto no ignora el caso. –

+0

Creo que un simple cambio a 'group word by word.ToLower()' lo arreglará, por supuesto todas tus claves estarán en minúsculas. –

+0

Para ser justos, su respuesta probablemente fue escrita antes de que se agregara. –

4
var xs = new StringCollection { "House", "Car", "House", "Dog", "Cat" }; 

foreach (var g in xs.Cast<string>() 
        .GroupBy(x => x, StringComparer.CurrentCultureIgnoreCase)) 
{ 
    Console.WriteLine("{0}: {1}", g.Key, g.Count()); 
} 
0
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)); 
} 
+0

¡No! Uso de ToLower para comparación de cadenas que no distingue entre mayúsculas y minúsculas == facefalm.jpg – dtb

0

Debe ser tan simple como:

Console.WriteLine(stringCollection.Distinct().Count()); 
+1

Eso mostrará las cadenas exclusivas, pero no el recuento de las duplicadas. –

+1

Esto contará el número de cadenas únicas. por lo que devolvería '4' –

+0

@Ray & @Matthew: Sí, el OP preguntó cómo contar cuántas palabras únicas hay. Ahora que el ejemplo se ha formateado, me doy cuenta de que esto no es lo que el OP pretendía pedir ... – Guffa

1

Dado que está utilizando StringCollection y desea ignorar caso, necesitará para usar Enumerable.GroupBy con Enumerable.Cast:

var results = collection.Cast<string>.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); 
0
var query =  
    from s in Collection 
    group s by s.Description into g 
    select new {word = g.Key, num = g.Count()}; 
1

Para construir un único resultado de valor de cadena ...

var stringCollection = new[] { "House", "Car", "house", "Dog", "Cat" }; 
var result = stringCollection.Cast<string>().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 a cada valor en una línea diferente ...

var stringCollection = new[] { "House", "Car", "house", "Dog", "Cat" }; 
var result = stringCollection.Cast<string>().GroupBy(
            k => k, 
            StringComparer.InvariantCultureIgnoreCase); 

foreach (var value in result) 
    Console.WriteLine("{0} --> {1}", value.Key, value.Count()); 
+0

'.Cast ()' agregado para trabajar con 'StringCollection' –

Cuestiones relacionadas