Generieren einer Reihe von Buchstaben im Alphabet

89

Gibt es eine einfache Möglichkeit, ein Array mit den Buchstaben des Alphabets in C # zu generieren? Es ist nicht allzu schwer, es von Hand zu machen, aber ich habe mich gefragt, ob es einen eingebauten Weg gibt, dies zu tun.

Helephant
quelle
Zu Ihrer Information, diese Frage wurde bereits im Hinblick auf die Internationalisierung gestellt.
Serge Wautier
7
Nein, nur eine dieser Fragen, bei denen ich mich gefragt habe, ob es einen besseren Weg gibt. :)
Helephant
Die Rückseite finden Sie hier stackoverflow.com/a/667902/2343
Sameer Alibhai

Antworten:

191

Ich glaube nicht, dass es einen eingebauten Weg gibt, aber ich denke, der einfachste wäre

  char[] alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
Bob
quelle
7
Es funktioniert auch mit anderen Alphabeten, solange Sie die Zeichenfolge in eine Ressource
Olmo
1
Dies ist der beste Weg, wenn Sie sicherstellen möchten, dass Ihr Code auf Computern mit verschiedenen Sprachen funktioniert. Andernfalls können Sie, wenn Sie Ihr Alphabet dynamisch generieren (wie andere Antworten unten), auf verschiedenen Computern mit einem anderen Alphabet enden.
Luis
Wie funktioniert das mit verschiedenen Sprachen? Wird dies auf magische Weise chinesische Buchstaben enthalten oder Buchstaben aus anderen Sprachen?
Paweł Audionysos
102

C # 3.0:

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

ja es funktioniert auch wenn die einzige Überladung von Enumerable.Range int Parameter akzeptiert ;-)

Pop Catalin
quelle
'z' - 'a' + 1 = Es sieht einfach sehr ungeschickt aus, aber ich sehe keinen Weg daran vorbei :(
CasperT
String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));kehrt zurück ABCDEFGHIJKLMNOPQRSTUVWXYZ;
Abatishchev
14
@ CasperT: WahrscheinlichEnumerable.Range('a', 26)
abatishchev
Dies funktioniert nicht für Sprachen mit Buchstaben, deren ASCII-Codes außerhalb des Bereichs 'a' - 'z' liegen. In solchen Fällen können Sie diese Methode nicht verwenden. Ansonsten schöne Lösung.
Michal B.
56
for (char letter = 'A'; letter <= 'Z'; letter++)
{
     Debug.WriteLine(letter);
}
Simon
quelle
34
char[] alphabet = Enumerable.Range('A', 26).Select(x => (char)x).ToArray();
Raz Megrelidze
quelle
3
Ich denke, dies ist die beste Lösung, da Sie diese Methode auch zum Erstellen eines Arrays von Ganzzahlen und Kleinbuchstaben verwenden können. Dies sollte die akzeptierte Antwort sein :)
Kapé
@ PopCatalin hatte zuerst die richtige Antwort, aber dies ist der Ansatz, den ich gewählt habe. Es ist ein bisschen einfacher zu verfolgen, was los ist, und die einzige Information, von der man annimmt, dass Sie wissen, dass das Alphabet 26 Zeichen ('A' .. 'Z') enthält, was ich für vernünftig halte.
Mass Dot Net
21

Ich habe dies geschrieben, um den MS Excel-Spaltencode (A, B, C, ..., Z, AA, AB, ..., ZZ, AAA, AAB, ...) basierend auf einem 1-basierten Index zu erhalten. (Natürlich wird beim Umschalten auf Null einfach das column--;am Anfang weggelassen.)

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
quelle
2
Oh hey, nur das Ersetzen Convert.ToStringdurch String.valueOfmacht es in Java :)
Nyerguds
1
Wie wäre es mit getIndexFromColumnName?
Oneiros
13

Angenommen, Sie meinen die Buchstaben des englischen Alphabets ...

    for ( int i = 0; i < 26; i++ )
    {
        Console.WriteLine( Convert.ToChar( i + 65 ) );
    }
    Console.WriteLine( "Press any key to continue." );
    Console.ReadKey();
rp.
quelle
9
Es ist besser, (int) 'A' zu verwenden, anstatt 65 fest zu codieren. Dadurch wird der Code besser lesbar und weniger fehleranfällig.
Mehrdad Afshari
In der führenden Codierung mit 'A'! = 65 (EBCDIC) sind A bis Z jedoch nicht sequenziell.
James Curran
5
Sieht für mich nicht nach einem Array aus.
Leichtigkeitsrennen im Orbit
@MehrdadAfshari Intern verwendete Codierung ist irrelevant. Was ist relevant ist , dass die Werte vom Typ Char Unicode - Codepunkte sind, und diejenigen , sind AZ sequentiell.
Nyerguds
8

Sie könnten so etwas tun, basierend auf den ASCII-Werten der Zeichen:

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
}

(Siehe die Tabelle hier .) Sie wandeln nur vom int-Wert des Zeichens in den Zeichenwert um - dies funktioniert jedoch nur für ASCII-Zeichen, nicht für verschiedene Sprachen usw.

EDIT: Wie von Mehrdad im Kommentar zu einer ähnlichen Lösung vorgeschlagen, ist es besser, dies zu tun:

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

Dies setzt das A-Zeichen auf seinen int-Wert und erhöht es dann basierend darauf, sodass es nicht fest codiert ist.

xan
quelle
Dieser Code hat einen kleinen Fehler. i = 0 bis <27 enthält 27 Buchstaben (Array-Element 0, dann Elemente 1 bis 26).
Brian
Sie können es noch besser machen: Alphabet [i] = (char) (i + 'A'); Gleiches Ergebnis
CasperT
1
Sollte es nicht sein char[] alphabet = new char[26];?
Shishir Gupta
5

Beachten Sie auch, dass die Zeichenfolge einen Operator [] hat, der ein Zeichen zurückgibt, und ein ist IEnumerable<char>, sodass Sie für die meisten Zwecke eine Zeichenfolge als Zeichen [] verwenden können. Daher:

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

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

Überrascht hat niemand eine Ausbeutelösung vorgeschlagen:

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

Beispiel:

foreach (var c in Alphabet())
{
    Console.Write(c);
}
Weston
quelle
Schön, aber das ist eine bizarre Art, eine forSchleife zu schreiben .
Nyerguds
@Nyerguds Wenn Sie das yield returnTeil meinen , ist es nicht wirklich gleichbedeutend mit einer for-Schleife. Es ist so, dass es verwendet werden könnte, um eine unendliche Reihe träge zurückzugeben.
Weston
Nein, ich meine die Tatsache, dass Sie whileeinen Zähler haben, der jede Runde erhöht und mit einem festen Wert endet. Genau das forsollte ersetzen.
Nyerguds
Ich verstehe was du meinst. Könnte dort eine for-Schleife verwenden. Es war vor 4 Jahren, so schwer zu erklären, warum ich es nicht getan habe!
Weston
2
var alphabets = Enumerable.Range('A', 26).Select((num) => ((char)num).ToString()).ToList();
Pradeep TM
quelle
0
char alphaStart = Char.Parse("A");
char alphaEnd = Char.Parse("Z");
for(char i = alphaStart; i <= alphaEnd; i++) {
    string anchorLetter = i.ToString();
}
aa.
quelle
Anscheinend haben Sie nicht gelernt, wie man die richtigen Anführungszeichen für Zeichen verwendet. Es gibt keinen Grund, dies anhand eines Strings zu analysieren. Verwenden Sie einfach char alphaStart = 'A';einfache Anführungszeichen anstelle von doppelten Anführungszeichen.
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
quelle
feste Formatierung, aber Code scheint unvollständig zu sein (werfen Sie einen Blick auf die ifund whileAnweisungen)
Oliver
1
Woah, Rekursion für etwas so Einfaches? Sie können dies mit einer einfachen
Weile
0

4 Möglichkeiten, um das englische Alphabet in der Konsole zu erhalten:

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
quelle
Auch wenn dies eine Lösung ist, geben Sie bitte weitere Informationen dazu und deren Funktionsweise an.
George Z.
0

Leider gibt es keinen gebrauchsfertigen Weg.

Sie können verwenden; char [] character = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();

Rick
quelle