Gerando uma série de letras no alfabeto

91

Existe uma maneira fácil de gerar uma matriz contendo as letras do alfabeto em C #? Não é muito difícil fazer isso manualmente, mas eu queria saber se existe uma maneira embutida de fazer isso.

Helephant
fonte
Para sua informação, esta pergunta foi feita antes com a internacionalização em mente.
Serge Wautier
7
Não, apenas uma daquelas perguntas em que me pergunto se existe uma maneira melhor. :)
Helephant
O reverso pode ser encontrado aqui stackoverflow.com/a/667902/2343
Sameer Alibhai

Respostas:

193

Não acho que haja uma maneira embutida, mas acho que o mais fácil seria

  char[] alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
Prumo
fonte
7
Também funciona em outros alfabetos, contanto que você coloque a string em um Recurso :)
Olmo
1
Esta é a melhor maneira se você deseja garantir que seu código funcione em máquinas com linguagens diferentes. Caso contrário, se você gerar seu alfabeto dinamicamente (como outras respostas abaixo), você pode terminar com um alfabeto diferente em máquinas diferentes.
Luis de
Como isso funciona com idiomas diferentes? Será que isso de alguma forma conterá letras chinesas ou letras de outras línguas?
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);
}

sim, funciona mesmo se a única sobrecarga de Enumerable.Range aceita parâmetros int ;-)

Pop Catalin
fonte
'z' - 'a' + 1 = Parece muito desajeitado, mas não consigo ver uma maneira de contornar isso :(
CasperT
String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));retorna ABCDEFGHIJKLMNOPQRSTUVWXYZ;
abatishchev
14
@CasperT: ProvavelmenteEnumerable.Range('a', 26)
abatishchev
Isso não funcionará para os idiomas que possuem letras cujos códigos ASCII estão fora do intervalo 'a' - 'z'. Você não pode usar este método em tais casos. Boa solução caso contrário.
Michal B.
57
for (char letter = 'A'; letter <= 'Z'; letter++)
{
     Debug.WriteLine(letter);
}
Simon
fonte
35
char[] alphabet = Enumerable.Range('A', 26).Select(x => (char)x).ToArray();
Raz Megrelidze
fonte
3
Acho que esta é a melhor solução porque você pode usar esse método para criar uma matriz de inteiros e letras minúsculas também. Esta deve ser a resposta aceita :)
Kapé
@PopCatalin teve a resposta correta primeiro, mas esta é a abordagem que escolhi. É um pouco mais fácil acompanhar o que está acontecendo e a única informação que ele presume que você sabe é que o alfabeto contém 26 caracteres ('A' .. 'Z'), o que acredito ser razoável.
Mass Dot Net
21

Eu escrevi isso para obter o código de coluna do MS Excel (A, B, C, ..., Z, AA, AB, ..., ZZ, AAA, AAB, ...) com base em um índice baseado em 1. (Claro, mudar para base zero é simplesmente deixar de fora o column--;no início.)

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
fonte
2
Ah, ei, apenas substituir Convert.ToStringpor String.valueOffaz funcionar em Java :)
Nyerguds
1
Que tal getIndexFromColumnName?
oneiros
13

Supondo que você se refira às letras do alfabeto inglês ...

    for ( int i = 0; i < 26; i++ )
    {
        Console.WriteLine( Convert.ToChar( i + 65 ) );
    }
    Console.WriteLine( "Press any key to continue." );
    Console.ReadKey();
rp.
fonte
9
É melhor usar (int) 'A' em vez de hardcoding 65. Isso tornará o código mais legível e menos sujeito a erros.
Mehrdad Afshari
No entanto, na codificação inicial onde 'A'! = 65, (EBCDIC), A a Z não são sequenciais.
James Curran
5
Não parece uma matriz para mim.
Lightness Races in Orbit
@MehrdadAfshari A codificação usada internamente é irrelevante. O que é relevante é que os valores do tipo Char são pontos de código Unicode, e aqueles que são AZ seqüencial.
Nyerguds
8

Você poderia fazer algo assim, com base nos valores ascii dos personagens:

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
}

(Veja a tabela aqui .) Você está apenas convertendo o valor int do caractere para o valor do caractere - mas isso só funciona para caracteres ASCII e não para idiomas diferentes, etc.

EDITAR: conforme sugerido por Mehrdad no comentário para uma solução semelhante, é melhor fazer isso:

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

Isso converte o caractere A em seu valor interno e, em seguida, incrementa com base nisso, portanto, não é codificado.

xan
fonte
Este código tem um pequeno erro. i = 0 a <27 inclui 27 letras (elemento da matriz 0, em seguida, elementos 1 a 26).
Brian
Você pode torná-lo ainda melhor: alphabet [i] = (char) (i + 'A'); Mesmo resultado
CasperT
1
Não deveria ser char[] alphabet = new char[26];?
Shishir Gupta
5

Observe também que a string tem um operador [] que retorna um Char e é um IEnumerable<char>, portanto, para a maioria dos propósitos, você pode usar uma string como um char []. Conseqüentemente:

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

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

Surpreso, ninguém sugeriu uma solução de rendimento:

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

Exemplo:

foreach (var c in Alphabet())
{
    Console.Write(c);
}
Weston
fonte
Legal, mas essa é uma maneira bizarra de basicamente escrever um forloop.
Nyerguds
@Nyerguds se você quer dizer a yield returnparte, não é realmente equivalente a um loop for. É tal que poderia ser usado para retornar uma série infinita preguiçosamente.
Weston
Não, quero dizer o fato de você ter um whilecom um contador que aumenta a cada turno e termina em um valor fixo. Isso é exatamente o que forfoi projetado para substituir.
Nyerguds
Eu vejo o que você quer dizer. Poderia usar um loop for lá. Foi há 4 anos, é tão difícil explicar por que não o fiz!
Weston
2
var alphabets = Enumerable.Range('A', 26).Select((num) => ((char)num).ToString()).ToList();
Pradeep TM
fonte
0
char alphaStart = Char.Parse("A");
char alphaEnd = Char.Parse("Z");
for(char i = alphaStart; i <= alphaEnd; i++) {
    string anchorLetter = i.ToString();
}
aa.
fonte
Parece que você não aprendeu como usar as aspas corretas para caracteres. Não há razão para analisar isso da string; apenas use char alphaStart = 'A';, com aspas simples em vez de aspas duplas.
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
fonte
formatação corrigida, mas o código parece estar incompleto (dê uma olhada nas instruções ife while)
Oliver
1
Woah, recursão para algo tão simples? Você pode fazer isso com um simples While e dividindo por 26.
Nyerguds
0

4 maneiras de obter o alfabeto inglês no 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
fonte
Mesmo que seja uma solução, forneça mais informações sobre ela e o que ela faz.
George Z.
0

Infelizmente, não existe uma forma pronta para usar.

Você pode usar; char [] characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();

Rick
fonte