J'ai un code pour lequel je veux compter le nombre d'apparitions de chaque lettre en alphabet dans la chaîne d'entrée. J'ai utilisé un dictionnaire <char, int> pour avoir une clé pour chaque lettre et une valeur comme le nombre d'apparitions. Alors, comment avoir une liste de «a» à «z» à utiliser comme clés? J'ai essayé ceci:
Dictionary<char, int> alphabetCounter = new Dictionary<char, int>();
for (char ch = 'a'; ch <= 'z'; ch++)
alphabetCounter[ch] = 0;
Est-ce une meilleure façon d'avoir la liste de «a» à «z»? Merci.
4 Réponses :
Voici un moyen de le faire dans LINQ:
var alphabetCounter = Enumerable.Range(97, 26).ToDictionary(i => (char)i, i => 0);
Cela créera un dictionnaire avec tous les caractères avec des valeurs 0.
Codes ASCII de l' alphabet (minuscules) commence à 97, on peut alors prendre 26 chiffres à partir de là et de les convertir en char .
En utilisant Linq essayez ceci pour avoir une liste de "a" à "z".
var dictionary = Enumerable.Range('a', 'z' - 'a' + 1).Select(c => (char)c).ToDictionary(i => (char)i, i => 0);
Si vous voulez obtenir en majuscules, c'est la même chose mais en utilisant des majuscules.
var list = Enumerable.Range('A', 'Z' - 'A' + 1).Select(c => (char)c).ToList();
Éditer:
Votre question est d'obtenir la liste, mais pour obtenir un dictionnaire, vous pouvez utiliser .ToDictionary() et initialiser avec la valeur 0:
var list = Enumerable.Range('a', 'z' - 'a' + 1).Select(c => (char)c).ToList();
La même casse en majuscules / minuscules.
Merci mec. ta réponse était la meilleure.
J'apprécie si vous m'expliquez cette partie ('A', 'Z' - 'A' + 1) de votre code @JF
'A' et 'Z' sont des valeurs char et Enumerable.Range attend un entier, donc char est analysé en int . La valeur int est le code ASCII, donc le Enumerable.Range() con boucle à travers les lettres de «A» à la fin, calculé avec «Z» - «A» +1. Si vous préférez, je modifie la question et j'essaie de mieux expliquer.
C'est vraiment gentil de ta part @JF
La performance est-elle une chose? Vous pouvez rester simple.
Vous n'avez pas besoin de créer votre propre dictionnaire, d'enregistrer toutes les possibilités puis de démarrer le counter[i]++ pour chaque occurrence, cela me semble un peu exagéré.
Vous pouvez regrouper les lettres en utilisant .GroupBy (System.Linq), puis après vous pouvez vérifier le nombre de chaque occurrence.
Exemple:
t - 2 e - 1 s - 1
Production:
var word = "test";
var groupedLetters = word.GroupBy(x => x);
foreach(var letter in groupedLetters)
{
Console.WriteLine($"{letter.Key} - {letter.Count()}");
}
Salut, cet exemple vous aidera:
List<char> LS = new List<char>() {'A', 'B', 'C', 'D', 'A', 'D', 'B', 'A'};
Dictionary<char,int> AlphaDictionary = (from x in LS group x by x).Select(x => new {Alpha = x.Key, Count = x.Count()}).ToDictionary(x=>x.Alpha,x=>x.Count);
Si cela ne demandait pas un «meilleur» moyen (mieux comment?), Ce serait un doublon de Générer un tableau de lettres dans l'alphabet
Totalement basé sur l'opinion comme l'a dit @HereticMonkey ... Si vous cherchez le moyen le plus compact -
var alphabetCounter = "abc".ToDictionary(keySelector: x=>x, x=>0);est probablement le plus court ... c'est également inutile car vous obtenez le résultat directement de toute façon avecGroupBy- stackoverflow.com/a/31863230/477420