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.


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

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


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

35
char[] alphabet = Enumerable.Range('A', 26).Select(x => (char)x).ToArray();

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

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

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.


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

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

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

0
char alphaStart = Char.Parse("A");
char alphaEnd = Char.Parse("Z");
for(char i = alphaStart; i <= alphaEnd; i++) {
    string anchorLetter = i.ToString();
}

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++;
    }

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.