Generando una matriz de letras en el alfabeto

91

¿Existe una manera fácil de generar una matriz que contenga las letras del alfabeto en C #? No es demasiado difícil hacerlo a mano, pero me preguntaba si había una forma incorporada de hacer esto.

Elefante
fuente
Para su información, esta pregunta se ha hecho antes con la internacionalización en mente.
Serge Wautier
7
No, solo una de esas preguntas en las que me preguntaba si había una mejor manera. :)
Helephant
El reverso se puede encontrar aquí stackoverflow.com/a/667902/2343
Sameer Alibhai

Respuestas:

193

No creo que haya una forma incorporada, pero creo que la más fácil sería

  char[] alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
Beto
fuente
7
También funciona en otros alfabetos, siempre que coloques la cadena en un recurso :)
Olmo
1
Esta es la mejor manera si desea asegurarse de que su código funcione en máquinas con diferentes idiomas. De lo contrario, si genera su alfabeto dinámicamente (como otras respuestas a continuación), puede terminar con un alfabeto diferente en diferentes máquinas.
Luis
¿Cómo funciona esto con diferentes idiomas? ¿Contendrá esto de alguna manera mágicamente letras chinas, o letras de otros idiomas?
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í, funciona incluso si la única sobrecarga de Enumerable.Range acepta parámetros int ;-)

Pop Catalin
fuente
'z' - 'a' + 1 = Se ve muy torpe, pero no veo una forma de
evitarlo
String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));devoluciones ABCDEFGHIJKLMNOPQRSTUVWXYZ;
abatishchev
14
@CasperT: ProbablementeEnumerable.Range('a', 26)
abatishchev
Esto no funcionará para los idiomas que tienen letras cuyos códigos ASCII están fuera del rango 'a' - 'z'. No puede utilizar este método en tales casos. Buena solución de lo contrario.
Michal B.
57
for (char letter = 'A'; letter <= 'Z'; letter++)
{
     Debug.WriteLine(letter);
}
Simón
fuente
35
char[] alphabet = Enumerable.Range('A', 26).Select(x => (char)x).ToArray();
Raz Megrelidze
fuente
3
Creo que esta es la mejor solución porque puede usar este método para crear una matriz de números enteros y letras minúsculas también. Esta debería ser la respuesta aceptada :)
Kapé
@PopCatalin primero tuvo la respuesta correcta, pero este es el enfoque que seguí. Es un poco más fácil seguir lo que está sucediendo, y la única información que se supone que sabe es que el alfabeto contiene 26 caracteres ('A' .. 'Z'), lo cual creo que es razonable.
Mass Dot Net
21

Escribí esto para obtener el código de columna de Excel de MS (A, B, C, ..., Z, AA, AB, ..., ZZ, AAA, AAB, ...) basado en un índice basado en 1. (Por supuesto, cambiar a base cero es simplemente dejar el column--;al principio).

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
fuente
2
Oh, oye, solo reemplazarlo Convert.ToStringcon String.valueOfhace que funcione en Java :)
Nyerguds
1
¿Qué tal getIndexFromColumnName?
oneiros
13

Suponiendo que te refieres a las letras del 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.
fuente
9
Es mejor usar (int) 'A' en lugar de codificar 65. Hará que el código sea más legible y menos propenso a errores.
Mehrdad Afshari
Sin embargo, en la codificación inicial donde 'A'! = 65, (EBCDIC), A a Z no son secuenciales.
James Curran
5
No me parece una matriz.
Lightness Races in Orbit
@MehrdadAfshari La codificación utilizada internamente es irrelevante. Lo que es relevante es que los valores de tipo char son puntos de código Unicode, y los que son AZ secuencial.
Nyerguds
8

Podría hacer algo como esto, basado en los valores ascii de los caracteres:

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
}

(Consulte la tabla aquí ). Solo está pasando del valor int del carácter al valor del carácter, pero eso solo funciona para caracteres ascii, no para diferentes idiomas, etc.

EDITAR: Como sugirió Mehrdad en el comentario a una solución similar, es mejor hacer esto:

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

Esto convierte el carácter A en su valor int y luego se incrementa en base a esto, por lo que no está codificado.

xan
fuente
Este código tiene un error menor. i = 0 a <27 incluye 27 letras (elemento de matriz 0, luego elementos 1 a 26).
Brian
Puede hacerlo aún mejor: alfabeto [i] = (char) (i + 'A'); Mismo resultado
CasperT
1
¿No debería serlo char[] alphabet = new char[26];?
Shishir Gupta
5

Tenga en cuenta también que la cadena tiene un operador [] que devuelve un Char, y es an IEnumerable<char>, por lo que para la mayoría de los propósitos, puede usar una cadena como char []. Por lo tanto:

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

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

Sorprendido, nadie ha sugerido una solución de rendimiento:

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

Ejemplo:

foreach (var c in Alphabet())
{
    Console.Write(c);
}
Weston
fuente
Bien, pero esa es una forma extraña de básicamente escribir un forbucle.
Nyerguds
@Nyerguds si te refieres a la yield returnparte, no es realmente equivalente a un bucle for. Es tal que podría usarse para devolver una serie infinita perezosamente.
weston
No, me refiero al hecho de que tienes un whilecontador que aumenta cada turno y termina en un valor fijo. Eso es exactamente lo que forfue diseñado para reemplazar.
Nyerguds
Veo a que te refieres. Podría usar un bucle for allí. ¡Fue hace 4 años, tan difícil de explicar por qué no lo hice!
weston
2
var alphabets = Enumerable.Range('A', 26).Select((num) => ((char)num).ToString()).ToList();
Pradeep TM
fuente
0
char alphaStart = Char.Parse("A");
char alphaEnd = Char.Parse("Z");
for(char i = alphaStart; i <= alphaEnd; i++) {
    string anchorLetter = i.ToString();
}
Automóvil club británico.
fuente
Parece que no ha aprendido a utilizar las comillas correctas para los caracteres. No hay razón para analizar eso de una cadena; solo use char alphaStart = 'A';, con comillas simples en lugar de comillas dobles.
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
fuente
formato fijo, pero el código parece estar incompleto (eche un vistazo a las declaraciones ify while)
Oliver
1
Woah, ¿recursividad para algo tan simple? Puedes hacerlo con un simple
while
0

4 formas de obtener el alfabeto inglés en la consola:

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
fuente
Incluso si esta es una solución, proporcione más información al respecto y lo que hace.
George Z.28 de
0

Desafortunadamente, no existe una forma lista para usar.

Puedes usar; char [] caracteres = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();

Almiar
fuente