Comment compter le nombre d’occurrences de chaque mot dans la chaîne?

J’utilise le code suivant pour extraire des mots à partir d’une entrée de chaîne. Comment puis-je obtenir l’occurrence de chaque mot?

var words = Regex.Split(input, @"\W+") .AsEnumerable() .GroupBy(w => w) .Where(g => g.Count() > 10) .Select(g => g.Key); 

Au lieu de Regex.Split vous pouvez utiliser ssortingng.Split et obtenir le nombre pour chaque mot comme:

 ssortingng str = "Some ssortingng with Some ssortingng repeated"; var result = str.Split(new[] { " " }, SsortingngSplitOptions.RemoveEmptyEnsortinges) .GroupBy(r => r) .Select(grp => new { Word = grp.Key, Count = grp.Count() }); 

Si vous souhaitez filtrer les mots répétés au moins 10 fois, vous pouvez append une condition avant Select comme Where(grp=> grp.Count >= 10)

Pour la sortie:

 foreach (var item in result) { Console.WriteLine("Word: {0}, Count:{1}", item.Word, item.Count); } 

Sortie:

 Word: Some, Count:2 Word: ssortingng, Count:2 Word: with, Count:1 Word: repeated, Count:1 

Pour un regroupement sans distinction de casse, vous pouvez remplacer le GroupBy actuel par:

 .GroupBy(r => r, SsortingngComparer.InvariantCultureIgnoreCase) 

Donc, votre requête serait:

 var result = str.Split(new[] { " " }, SsortingngSplitOptions.RemoveEmptyEnsortinges) .GroupBy(r => r, SsortingngComparer.InvariantCultureIgnoreCase) .Where(grp => grp.Count() >= 10) .Select(grp => new { Word = grp.Key, Count = grp.Count() }); 

Essaye ça:

 var words = Regex.Split(input, @"\W+") .AsEnumerable() .GroupBy(w => w) .Select(g => new {key = g.Key, count = g.Count()}); 

Supprimez l’instruction Select pour conserver l’ IGrouping que vous pouvez utiliser pour afficher les clés et effectuer un nombre de valeurs.

 var words = Regex.Split(input, @"\W+") .AsEnumerable() .GroupBy(w => w) .Where(g => g.Count() > 10); foreach (var wordGrouping in words) { var word = wordGrouping.Key; var count = wordGrouping.Count(); } 

Vous pourriez produire un dictionnaire comme ceci:

 var words = Regex.Split(input, @"\W+") .GroupBy(w => w) .Select(g => g.Count() > 10) .ToDictionary(g => g.Key, g => g.Count()); 

Ou si vous souhaitez éviter de devoir calculer le nombre deux fois, comme ceci:

 var words = Regex.Split(input, @"\W+") .GroupBy(w => w) .Select(g => new { g.Key, Count = g.Count() }) .Where(g => g.Count > 10) .ToDictionary(g => g.Key, g => g.Count); 

Et maintenant, vous pouvez obtenir le nombre de mots comme celui-ci (en supposant que le mot “foo” apparaisse plus de 10 fois en input ):

 var fooCount = words["foo"];