¿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.
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 ;-)
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);}
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).
publicstaticString 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;}
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);}
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();
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,...staticstringCharacterIncrement(int colCount){intTempCount=0;string returnCharCount =string.Empty;if(colCount <=25){TempCount= colCount;charCharCount=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 <>{stringCharCount=string.Empty;CharCount=CharacterIncrement(i);
i++;}
Respuestas:
No creo que haya una forma incorporada, pero creo que la más fácil sería
fuente
C # 3.0:
sí, funciona incluso si la única sobrecarga de Enumerable.Range acepta parámetros int ;-)
fuente
String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));
devolucionesABCDEFGHIJKLMNOPQRSTUVWXYZ
;Enumerable.Range('a', 26)
fuente
fuente
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).fuente
Convert.ToString
conString.valueOf
hace que funcione en Java :)Suponiendo que te refieres a las letras del alfabeto inglés ...
fuente
Podría hacer algo como esto, basado en los valores ascii de los caracteres:
(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:
Esto convierte el carácter A en su valor int y luego se incrementa en base a esto, por lo que no está codificado.
fuente
char[] alphabet = new char[26];
?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:fuente
Sorprendido, nadie ha sugerido una solución de rendimiento:
Ejemplo:
fuente
for
bucle.yield return
parte, no es realmente equivalente a un bucle for. Es tal que podría usarse para devolver una serie infinita perezosamente.while
contador que aumenta cada turno y termina en un valor fijo. Eso es exactamente lo quefor
fue diseñado para reemplazar.fuente
fuente
char alphaStart = 'A';
, con comillas simples en lugar de comillas dobles.fuente
if
ywhile
)4 formas de obtener el alfabeto inglés en la consola:
fuente
Desafortunadamente, no existe una forma lista para usar.
Puedes usar; char [] caracteres = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();
fuente