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.
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 ;-)
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);}
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.)
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;}
É 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.
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);}
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();
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,...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++;}
Respostas:
Não acho que haja uma maneira embutida, mas acho que o mais fácil seria
fonte
C # 3.0:
sim, funciona mesmo se a única sobrecarga de Enumerable.Range aceita parâmetros int ;-)
fonte
String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));
retornaABCDEFGHIJKLMNOPQRSTUVWXYZ
;Enumerable.Range('a', 26)
fonte
fonte
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.)fonte
Convert.ToString
porString.valueOf
faz funcionar em Java :)Supondo que você se refira às letras do alfabeto inglês ...
fonte
Você poderia fazer algo assim, com base nos valores ascii dos personagens:
(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:
Isso converte o caractere A em seu valor interno e, em seguida, incrementa com base nisso, portanto, não é codificado.
fonte
char[] alphabet = new char[26];
?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:fonte
Surpreso, ninguém sugeriu uma solução de rendimento:
Exemplo:
fonte
for
loop.yield return
parte, não é realmente equivalente a um loop for. É tal que poderia ser usado para retornar uma série infinita preguiçosamente.while
com um contador que aumenta a cada turno e termina em um valor fixo. Isso é exatamente o quefor
foi projetado para substituir.fonte
fonte
char alphaStart = 'A';
, com aspas simples em vez de aspas duplas.fonte
if
ewhile
)4 maneiras de obter o alfabeto inglês no console:
fonte
Infelizmente, não existe uma forma pronta para usar.
Você pode usar; char [] characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();
fonte