Generazione di una matrice di lettere dell'alfabeto


91

Esiste un modo semplice per generare un array contenente le lettere dell'alfabeto in C #? Non è troppo difficile farlo a mano, ma mi chiedevo se ci fosse un modo integrato per farlo.


Cordiali saluti, questa domanda è stata posta in passato pensando all'internazionalizzazione.
Serge Wautier

7
No, solo una di quelle domande in cui mi chiedevo se ci fosse un modo migliore. :)
Helephant


Il contrario può essere trovato qui stackoverflow.com/a/667902/2343
Sameer Alibhai

Risposte:


193

Non penso che ci sia un modo integrato, ma penso che il più semplice sarebbe

  char[] alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();

7
Funziona anche su altri alfabeti, a patto di inserire la stringa in una risorsa :)
Olmo

1
Questo è il modo migliore se vuoi assicurarti che il tuo codice funzioni su macchine con linguaggi differenti. Altrimenti, se generi il tuo alfabeto dinamicamente (come altre risposte di seguito) puoi terminare con un alfabeto diverso su macchine diverse.
Luis

Come funziona con lingue diverse? Questo in qualche modo conterrà magicamente lettere cinesi o lettere di altre lingue?
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);
}

sì, funziona anche se l'unico overload di Enumerable.Range accetta parametri int ;-)


'z' - 'a' + 1 = Sembra davvero goffo, ma non riesco a vedere come
aggirarlo

String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));ritorni ABCDEFGHIJKLMNOPQRSTUVWXYZ;
abatishchev

14
@CasperT: ProbabilmenteEnumerable.Range('a', 26)
abatishchev

Questo non funzionerà per le lingue che hanno lettere i cui codici ASCII non rientrano nell'intervallo "a" - "z". Non è possibile utilizzare questo metodo in questi casi. Bella soluzione altrimenti.
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
Penso che questa sia la soluzione migliore perché puoi utilizzare questo metodo per creare anche un array di numeri interi e lettere minuscole. Questa dovrebbe essere la risposta accettata :)
Kapé

@PopCatalin aveva prima la risposta corretta, ma questo è l'approccio che ho seguito. È un po 'più facile seguire quello che sta succedendo, e l'unica informazione che presume tu sappia è che l'alfabeto contiene 26 caratteri ("A" .. "Z"), il che credo sia ragionevole.
Mass Dot Net

21

Ho scritto questo per ottenere il codice della colonna MS Excel (A, B, C, ..., Z, AA, AB, ..., ZZ, AAA, AAB, ...) basato su un indice basato su 1. (Ovviamente, passare alla base zero significa semplicemente tralasciare column--;all'inizio.)

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, solo sostituire Convert.ToStringcon lo String.valueOffa funzionare in Java :)
Nyerguds

1
Che ne dici di getIndexFromColumnName?
Oneiros

13

Supponendo che tu intenda le lettere dell'alfabeto inglese ...

    for ( int i = 0; i < 26; i++ )
    {
        Console.WriteLine( Convert.ToChar( i + 65 ) );
    }
    Console.WriteLine( "Press any key to continue." );
    Console.ReadKey();

9
È meglio usare (int) 'A' invece dell'hardcoding 65. Renderà il codice più leggibile e meno soggetto a errori.
Mehrdad Afshari,

Tuttavia, nella codifica iniziale dove 'A'! = 65, (EBCDIC), dalla A alla Z non sono sequenziali.
James Curran,

5
Non mi sembra un array.
Gare di leggerezza in orbita

@MehrdadAfshari La codifica utilizzata internamente è irrilevante. Ciò che è rilevante è che i valori di tipo Char sono punti di codice Unicode e quelli sono sequenziali AZ.
Nyerguds

8

Potresti fare qualcosa del genere, in base ai valori ASCII dei caratteri:

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
}

(Vedi la tabella qui .) Stai solo trasmettendo dal valore int del carattere al valore del carattere, ma funziona solo per i caratteri ASCII, non per lingue diverse ecc.

EDIT: come suggerito da Mehrdad nel commento a una soluzione simile, è meglio farlo:

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

Questo lancia il carattere A al suo valore int e quindi aumenta in base a questo, quindi non è hardcoded.


Questo codice ha un errore minore. i = da 0 a <27 include 27 lettere (elemento dell'array 0, quindi elementi da 1 a 26).
Brian

Puoi renderlo ancora migliore: alfabeto [i] = (char) (i + 'A'); Stesso risultato
CasperT

1
Non dovrebbe essere char[] alphabet = new char[26];?
Shishir Gupta

5

Nota anche che la stringa ha un operatore [] che restituisce un carattere ed è an IEnumerable<char>, quindi per la maggior parte degli scopi puoi usare una stringa come carattere []. Quindi:

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

foreach(char c in alpha)
{  
     Console.WriteLine(c);
}

3

Sorpreso nessuno ha suggerito una soluzione di resa:

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

Esempio:

foreach (var c in Alphabet())
{
    Console.Write(c);
}

Bello, ma è un modo bizzarro di scrivere fondamentalmente un forloop.
Nyerguds

@Nyerguds se intendi la yield returnparte, non è realmente equivalente a un ciclo for. È tale che potrebbe essere utilizzato per restituire pigramente una serie infinita.
Weston

No, intendo il fatto che hai un whilecon un contatore che aumenta ogni turno e finisce su un valore fisso. Questo è esattamente ciò che è forstato progettato per sostituire.
Nyerguds

Capisco cosa vuoi dire. Potrebbe usare un ciclo for lì. Sono passati 4 anni, è così difficile spiegare perché non l'ho fatto!
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();
}

Sembra che tu non abbia imparato a usare le virgolette corrette per i caratteri. Non c'è motivo per analizzarlo dalla stringa; basta usare char alphaStart = 'A';, con virgolette singole anziché doppie.
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++;
    }

formattazione fissa, ma il codice sembra essere incompleto (dai un'occhiata alle istruzioni ife while)
Oliver

1
Woah, ricorsione per qualcosa di così semplice? Puoi farlo con un semplice
istante

0

4 modi per ottenere l'alfabeto inglese nella 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()}");
    }
}

Anche se questa è una soluzione, fornisci maggiori informazioni su di essa e su cosa fa.
George Z.28

0

Purtroppo non esiste un modo pronto per l'uso.

Puoi usare; char [] characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.