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"];