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.


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

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


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

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

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

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

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.


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

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

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

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

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

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.