J'essaye d'aller dans un fichier extraire les mots du fichier et regrouper chaque lettre dans la chaîne du fichier. Le groupement doit être ordonné par sa lettre (a, b, c, d, ect ..) puis compter chaque lettre et présenter un décompte de chaque lettre à la console, quelque chose comme ceci:

A: 56 b: 34 c: 53 d:

Je travaille donc avec le code suivant mais je ne pense pas que cela fonctionne comme je le souhaite, est-ce que quelqu'un a des idées? Merci!

var text = System.IO.File.ReadAllText("file.txt");
        var upper = text.ToUpper();
        var alpha = upper.Where(char.IsLetter).ToArray();
        var grouped = alpha.GroupBy(i => i % 26);
        var a = grouped.First(g => g.Key == 0).Count();
5
Jonathan 28 déc. 2015 à 01:24

3 réponses

Meilleure réponse

Quelque chose comme ça devrait fonctionner:

var text = System.IO.File.ReadAllText("file.txt");
var dictionary = new Dictionary<char,int>();
//count every letter
foreach (var symbol in text)
{
    //skip non letter characters
    if (!char.IsLetter(symbol))
         continue;

    var key = char.ToLower(symbol);
    if (dictionary.ContainsKey(key))
         dictionary[key]++;
    else
         dictionary.Add(key,1);
}
//result output
foreach (var pair in dictionary.OrderBy(p => p.Key))
{
    Console.Write("{0}: {1} ", pair.Key, pair.Value);
}

Ce n'est pas la plus petite solution, mais mieux que le regroupement en termes d'utilisation des ressources.

3
Andrey Tretyak 27 déc. 2015 à 22:58

Vous avez besoin d'un Select après le GroupBy pour obtenir les résultats dont vous avez besoin:

var result = text
    .ToUpper()
    .Where(char.IsLetter)
    .GroupBy(c => c)
    .Select(g => new { Letter = g.Key, Count = g.Count() });

Ensuite, pour mettre en forme les résultats comme "a: 56 b: 34 c: 53", vous pouvez utiliser string.Join et string.Format:

string formattedResult = string.Join(" ", result.Select(x => string.Format("{0}: {1}", x.Letter, x.Count)));
7
Jakub Lortz 27 déc. 2015 à 22:33

Vous opérez sur des lettres, pas des mots.

Vous avez besoin de Split(' '), pour obtenir une séquence de chaînes avec les mots individuels.

Vous pouvez ensuite regrouper par la première lettre de chaque mot.

0
SLaks 27 déc. 2015 à 22:27