8
votes

Compter les mots dans une collection à l'aide de LINQ

J'ai un objet StringCollection avec 5 mots en eux. 3 d'entre eux sont des mots en double. J'essaie de créer une requête LINQ qui comptera combien de mots uniques sont dans la collection et les rendent à la console. Donc, par exemple, si mon stringcollection a une "maison", "voiture", "house", "chien", "chat", alors il devrait sortir comme ceci: xxx

aucune idée sur Comment créer une requête LINQ pour faire cela?


4 commentaires

Comment voulez-vous gérer le boîtier?


Ignorer l'affaire. Chat et chat devraient être traités comme le même mot


Toutes vos réponses sont grandes sauf que je ne semble pas avoir une méthode .Groupby. Gardez à l'esprit que j'utilise un système.Collections.Specialized.StringCollection pour stocker les chaînes, pas un tableau à chaîne.


Dupliqué possible de C #: une méthode pour compter les occurrences dans une liste


7 Réponses :


4
votes
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 commentaires

0
votes
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));
}

1 commentaires

Non! Utilisation de tolower pour la comparaison de chaîne insensible à casse == visagefalm.jpg



0
votes

Il devrait être aussi simple que:

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


3 commentaires

Cela montrera les chaînes uniques, mais pas le nombre de dupliqués.


Cela comptera le nombre de chaînes uniques. Donc, il retournerait 4


@Ray & @matthew: Oui, l'OP a demandé comment compter combien de mots uniques il y a. Maintenant que l'exemple a été formaté, je me rends compte que ce n'est pas ce que l'OP avait l'intention de demander ...



12
votes

Essayez le suivant

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


5 commentaires

Je crois qu'un changement simple à le mot de groupe par Word.TObower () va réparer cela, bien sûr que toutes vos clés seront alors en minuscule.


Pour être juste sa réponse a probablement été écrite auparavant.


Quand j'essaie ceci, j'ai une erreur. N'oubliez pas que j'utilise un système System.Collections.Specialized.StringCollection pour stocker les chaînes, pas un tableau à chaîne


@icemanind J'ai changé ma réponse pour faire face à la collection faiblement dactylographiée.


@Taylor, ma réponse a été écrite avant que l'exigence de boîtier ait été ajoutée.



1
votes

Étant donné que vous utilisez StringCollection et que vous souhaitez ignorer l'affaire, vous devez utiliser Enumérable.groupby avec Enumérable.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 commentaires

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

0 commentaires

1
votes

Pour construire un seul résultat de la valeur de chaîne ...

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 commentaires