7
votes

comment avoir une liste de «a» à «z»?

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.

c#

2 commentaires

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 avec GroupBy - stackoverflow.com/a/31863230/477420


4 Réponses :


2
votes

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 .


0 commentaires

2
votes

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.


4 commentaires

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



2
votes

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()}");
}


0 commentaires

1
votes

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);


0 commentaires