2010-06-11 14 views
7

Mam obiekt StringCollection z 5 słów w nich. 3 z nich są zduplikowanymi słowami. Próbuję utworzyć kwerendę LINQ, która zliczy liczbę unikalnych słów w kolekcji i wyprowadzi je do konsoli. Tak więc, na przykład, jeśli moja StringCollection ma „Dom”, „Car”, „Dom”, „Dog”, „kot”, to powinien wypisać tak:Zliczanie słów w kolekcji przy użyciu LINQ

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

Wszelkie pomysły na stworzenie Zapytanie LINQ, aby to zrobić?

+0

Jak chcesz obsłużyć obudowę? –

+0

Ignoruj ​​obudowę. Kot i kot powinny być traktowane jako te same słowa. – Icemanind

+0

Wszystkie twoje odpowiedzi są świetne, ale wydaje mi się, że nie mam metody .GroupBy. Należy pamiętać, że używam obiektu System.Collections.Specialized.StringCollection do przechowywania ciągów, a nie tablicy łańcuchów. – Icemanind

Odpowiedz

11

Wypróbuj następujące

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

+1 Ale to nie ignoruje przypadku. –

+0

Wierzę, że prosta zmiana słowa "grupuj słowo po słowie.ToLower()" naprawi to, oczywiście wszystkie twoje klucze będą pisane małymi literami. –

+0

Aby być sprawiedliwym, jego odpowiedź została prawdopodobnie napisana przed dodaniem. –

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

Nie! Używanie ToLower do rozróżniania wielkości znaków niewrażliwych na wielkość znaków == facefalm.jpg – dtb

0

powinno być tak proste, jak:

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

To pokaże unikalne ciągi znaków, ale nie liczbę zduplikowanych. –

+1

Spowoduje to zliczenie unikalnych ciągów znaków. więc zwróci "4" –

+0

@Ray & @Matthew: Tak, OP zapytał, jak liczyć ile unikalnych słów istnieje. Teraz, gdy przykład został sformatowany, zdaję sobie sprawę, że nie jest to tym, o co OP chciał zapytać ... – Guffa

1

Zważywszy, że używasz StringCollection i chcą ignorować sprawy, musisz używać Enumerable.GroupBy z 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

Aby zbudować pojedynczy wynik wartość ciągu ...

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" 

Aby umieścić każdą wartość na innej linii ...

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 ()' dodane do pracy z 'StringCollection' –

Powiązane problemy