Générer un tableau de lettres dans l'alphabet

91

Existe-t-il un moyen simple de générer un tableau contenant les lettres de l'alphabet en C #? Ce n'est pas trop difficile de le faire à la main, mais je me demandais s'il y avait un moyen intégré de le faire.

Helephant
la source
Pour info, cette question a déjà été posée dans un esprit d'internationalisation.
Serge Wautier
7
Non, juste une de ces questions où je me demandais s'il y avait une meilleure façon. :)
Helephant
L'inverse peut être trouvé ici stackoverflow.com/a/667902/2343
Sameer Alibhai

Réponses:

193

Je ne pense pas qu'il y ait un moyen intégré, mais je pense que le plus simple serait

  char[] alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
Bob
la source
7
Cela fonctionne également sur d'autres alphabets, tant que vous placez la chaîne dans une ressource :)
Olmo
1
C'est le meilleur moyen si vous voulez vous assurer que votre code fonctionne sur des machines avec des langues différentes. Sinon, si vous générez votre alphabet dynamiquement (comme d'autres réponses ci-dessous), vous pouvez terminer avec un alphabet différent sur différentes machines.
Luis
Comment cela fonctionne avec différentes langues? Est-ce que cela contiendra comme par magie des lettres chinoises, ou des lettres d'autres langues?
Paweł Audionysos
103

C # 3.0:

char[] az = Enumerable.Range('a', 'z' - 'a' + 1).Select(i => (Char)i).ToArray();
foreach (var c in az)
{
    Console.WriteLine(c);
}

oui ça marche même si la seule surcharge d'Enumerable.Range accepte les paramètres int ;-)

Pop Catalin
la source
'z' - 'a' + 1 = Ça a l'air vraiment maladroit, mais je ne vois pas de moyen de contourner :(
CasperT
String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));retourne ABCDEFGHIJKLMNOPQRSTUVWXYZ;
abatishchev
14
@CasperT: ProbablyEnumerable.Range('a', 26)
abatishchev
Cela ne fonctionnera pas pour les langues qui ont des lettres dont les codes ASCII sont en dehors de la plage «a» - «z». Vous ne pouvez pas utiliser cette méthode dans de tels cas. Belle solution sinon.
Michal B.
57
for (char letter = 'A'; letter <= 'Z'; letter++)
{
     Debug.WriteLine(letter);
}
Simon
la source
35
char[] alphabet = Enumerable.Range('A', 26).Select(x => (char)x).ToArray();
Raz Megrelidze
la source
3
Je pense que c'est la meilleure solution car vous pouvez également utiliser cette méthode pour créer un tableau d'entiers et de lettres minuscules. Cela devrait être la réponse acceptée :)
Kapé
@PopCatalin avait d'abord la bonne réponse, mais c'est l'approche que j'ai choisie. Il est un peu plus facile de suivre ce qui se passe, et la seule information qu'il suppose que vous sachiez est que l'alphabet contient 26 caractères («A» .. «Z»), ce qui, à mon avis, est raisonnable.
Mass Dot Net
21

J'ai écrit ceci pour obtenir le code de colonne MS Excel (A, B, C, ..., Z, AA, AB, ..., ZZ, AAA, AAB, ...) basé sur un index basé sur 1. (Bien sûr, passer à la base zéro revient simplement à laisser le column--;au début.)

public static String getColumnNameFromIndex(int column)
{
    column--;
    String col = Convert.ToString((char)('A' + (column % 26)));
    while (column >= 26)
    {
        column = (column / 26) -1;
        col = Convert.ToString((char)('A' + (column % 26))) + col;
    }
    return col;
}
Nyerguds
la source
2
Oh hey, il suffit de le remplacer Convert.ToStringpar le String.valueOffait fonctionner en Java :)
Nyerguds
1
Que diriez-vous de getIndexFromColumnName?
oneiros
13

En supposant que vous vouliez dire les lettres de l'alphabet anglais ...

    for ( int i = 0; i < 26; i++ )
    {
        Console.WriteLine( Convert.ToChar( i + 65 ) );
    }
    Console.WriteLine( "Press any key to continue." );
    Console.ReadKey();
rp.
la source
9
Il vaut mieux utiliser (int) 'A' au lieu du hardcoding 65. Cela rendra le code plus lisible et moins sujet aux erreurs.
Mehrdad Afshari
Cependant, dans l'encodage principal où «A»! = 65, (EBCDIC), A à Z ne sont pas séquentiels.
James Curran
5
Cela ne me ressemble pas à un tableau.
Courses de légèreté en orbite
@MehrdadAfshari Le codage utilisé en interne n'est pas pertinent. Ce qui est pertinent, c'est que les valeurs de type Char sont des points de code Unicode, et celles-ci sont séquentielles AZ.
Nyerguds
8

Vous pouvez faire quelque chose comme ceci, basé sur les valeurs ascii des caractères:

char[26] alphabet;

for(int i = 0; i <26; i++)
{
     alphabet[i] = (char)(i+65); //65 is the offset for capital A in the ascaii table
}

(Voir le tableau ici .) Vous effectuez simplement un transtypage de la valeur int du caractère à la valeur du caractère - mais cela ne fonctionne que pour les caractères ascii et non dans des langues différentes, etc.

EDIT: Comme suggéré par Mehrdad dans le commentaire d'une solution similaire, il vaut mieux faire ceci:

alphabet[i] = (char)(i+(int)('A'));

Cela convertit le caractère A à sa valeur int, puis incrémente en fonction de cela, il n'est donc pas codé en dur.

xan
la source
Ce code a une erreur mineure. i = 0 à <27 comprend 27 lettres (élément de tableau 0, puis éléments 1 à 26).
Brian
Vous pouvez le rendre encore meilleur: alphabet [i] = (char) (i + 'A'); Même résultat
CasperT
1
Ne devrait-il pas l'être char[] alphabet = new char[26];?
Shishir Gupta
5

Notez également que la chaîne a un opérateur [] qui renvoie un Char, et est donc un IEnumerable<char>, donc dans la plupart des cas, vous pouvez utiliser une chaîne comme char []. Par conséquent:

string alpha = "ABCDEFGHIJKLMNOPQRSTUVQXYZ";
for (int i =0; i < 26; ++i)
{  
     Console.WriteLine(alpha[i]);
}

foreach(char c in alpha)
{  
     Console.WriteLine(c);
}
James Curran
la source
3

Surpris, personne n'a suggéré une solution de rendement:

public static IEnumerable<char> Alphabet()
{
    for (char letter = 'A'; letter <= 'Z'; letter++)
    {
        yield return letter;
    }
}

Exemple:

foreach (var c in Alphabet())
{
    Console.Write(c);
}
Weston
la source
Bien, mais c'est une façon bizarre d'écrire une forboucle.
Nyerguds
@Nyerguds si vous voulez dire la yield returnpartie, ce n'est pas vraiment équivalent à une boucle for. Il est tel qu'il pourrait être utilisé pour renvoyer paresseusement une série infinie.
weston
Non, je veux dire le fait que vous ayez un whileavec un compteur qui incrémente à chaque tour et se termine sur une valeur fixe. C'est exactement ce qui a forété conçu pour remplacer.
Nyerguds
Je vois ce que tu veux dire. Pourrait utiliser une boucle for là-bas. C'était il y a 4 ans, tellement difficile d'expliquer pourquoi je ne l'ai pas fait!
weston
2
var alphabets = Enumerable.Range('A', 26).Select((num) => ((char)num).ToString()).ToList();
Pradeep TM
la source
0
char alphaStart = Char.Parse("A");
char alphaEnd = Char.Parse("Z");
for(char i = alphaStart; i <= alphaEnd; i++) {
    string anchorLetter = i.ToString();
}
aa.
la source
Il semble que vous n'ayez pas appris à utiliser les guillemets corrects pour les caractères. Il n'y a aucune raison d'analyser cela à partir de la chaîne; utilisez simplement char alphaStart = 'A';, avec des guillemets simples au lieu de guillemets doubles.
Nyerguds
0
//generate a list of alphabet using csharp
//this recurcive function will return you
//a string with position of passed int
//say if pass 0 will return A ,1-B,2-C,.....,26-AA,27-AB,....,701-ZZ,702-AAA,703-AAB,...

static string CharacterIncrement(int colCount)
{
    int TempCount = 0;
    string returnCharCount = string.Empty;

    if (colCount <= 25)
    {
        TempCount = colCount;
        char CharCount = Convert.ToChar((Convert.ToInt32('A') + TempCount));
        returnCharCount += CharCount;
        return returnCharCount;
    }
    else
    {
        var rev = 0;

        while (colCount >= 26)
        {
            colCount = colCount - 26;
            rev++;
        }

        returnCharCount += CharacterIncrement(rev-1);
        returnCharCount += CharacterIncrement(colCount);
        return returnCharCount;
    }
}

//--------this loop call this function---------//
int i = 0;
while (i <>
    {
        string CharCount = string.Empty;
        CharCount = CharacterIncrement(i);

        i++;
    }
rjdmello
la source
mise en forme fixe, mais le code semble incomplet (jetez un œil aux instructions ifet while)
Oliver
1
Woah, récursion pour quelque chose d'aussi simple? Vous pouvez le faire avec un simple While, et en divisant par 26.
Nyerguds
0

4 façons d'obtenir l'alphabet anglais dans la console:

public void ShowEnglishAlphabet()
{
    var firstLetter = 'a';
    var endLetter = 'z';
    for (var letter = firstLetter; letter <= endLetter; letter++)
    {
        Console.WriteLine($"{letter}-{letter.ToString().ToUpper()}");
    }
}

public void ShowEnglishAlphabetFromUnicodeTableDecNumber()
{
    var firstLetter = 97;
    var endLetter = 122;
    for (var letterNumberUnicodeTable = firstLetter; 
    letterNumberUnicodeTable <= endLetter; letterNumberUnicodeTable++)
    {
        Console.WriteLine($"{(char)letterNumberUnicodeTable}- 
        {((char)letterNumberUnicodeTable).ToString().ToUpper()}");
    }
}

public void ShowEnglishAlphabetUnicodeTableEscapeSequence()
{
    var firstLetter = '\u0061';
    var endLetter = '\u007A';
    for (var letterNumberUnicodeTable = firstLetter; 
    letterNumberUnicodeTable <= endLetter; letterNumberUnicodeTable++)
    {
        Console.WriteLine($"{letterNumberUnicodeTable}- 
        {letterNumberUnicodeTable.ToString().ToUpper()}");
    }
}   

public void ShowEnglishAlphabetUnicodeTableLinq()
{
    var alphabets = Enumerable.Range('a', 26).Select(letter => 
    ((char)letter).ToString()).ToList();
    foreach (var letter in alphabets)
    {
        Console.WriteLine($"{letter}-{letter.ToUpper()}");
    }
}
Paul Alexeev
la source
Même s'il s'agit d'une solution, veuillez fournir plus d'informations à ce sujet et ce qu'elle fait.
George Z.28
0

Malheureusement, il n'y a pas de moyen prêt à l'emploi.

Vous pouvez utiliser; char [] characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();

Meule
la source