2010-06-11 15 views
7

Ho un oggetto StringCollection con 5 parole al loro interno. 3 di loro sono parole duplicate. Sto cercando di creare una query LINQ che conterrà quante parole uniche sono presenti nella raccolta e le invierà alla console. Così, per esempio, se la mia StringCollection ha 'Casa', 'Car', 'Casa', 'Dog', 'gatto', allora dovrebbe output come questo:Conteggio delle parole in una raccolta utilizzando LINQ

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

Tutte le idee su come creare un Query LINQ per fare questo?

+0

Come si desidera gestire involucro? –

+0

Ignora caso. Gatto e gatto dovrebbero essere trattati come la stessa parola – Icemanind

+0

Tutte le tue risposte sono grandiose tranne che non sembra che abbia un metodo .GroupBy. Tieni presente che sto utilizzando un oggetto System.Collections.Specialized.StringCollection per archiviare le stringhe, non una serie di stringhe. – Icemanind

risposta

11

provare il seguente

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

+1 Ma questo non ignora il caso. –

+0

Credo che una semplice modifica a 'raggruppa parola per parola.ToLower()' risolverà il problema, ovviamente tutte le tue chiavi saranno in minuscolo. –

+0

Per essere onesti, la sua risposta è stata probabilmente scritta prima che venisse aggiunta. –

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! Utilizzo di ToLower per confronto stringhe senza distinzione tra maiuscole e minuscole == facefalm.jpg – dtb

0

Dovrebbe essere semplice come:

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

Questo mostrerà le stringhe univoche, ma non il numero di duplicati. –

+1

Questo conterà il numero di stringhe univoche. quindi restituire '4' –

+0

@Ray & @Matthew: Sì, l'OP ha chiesto come contare quante parole uniche ci sono. Ora che l'esempio è stato formattato, mi rendo conto che questo non è ciò che l'OP intendeva chiedere ... – Guffa

1

Dato che si sta utilizzando StringCollection e desidera ignorare caso, avrete bisogno di utilizzare 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

Per costruire un unico risultato valore stringa ...

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" 

mettere ogni valore su una linea diversa ...

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 ()' aggiunto per funzionare con 'StringCollection' –

Problemi correlati