Есть ли простой способ создать массив, содержащий буквы алфавита в C #? Это не так уж сложно сделать вручную, но мне было интересно, есть ли встроенный способ сделать это.
Он также работает с другими алфавитами, если вы помещаете строку в Ресурс :)
Olmo,
1
Это лучший способ, если вы хотите убедиться, что ваш код работает на машинах с разными языками. В противном случае, если вы генерируете свой алфавит динамически (как другие ответы ниже), вы можете закончить с другим алфавитом на разных машинах.
Луис
Как это работает с разными языками? Будет ли это каким-то волшебным образом содержать китайские буквы или буквы других языков?
Paweł Audionysos
104
С # 3.0:
char[] az = Enumerable.Range('a', 'z' - 'a' + 1).Select(i => (Char)i).ToArray();
foreach (var c in az)
{
Console.WriteLine(c);
}
да, он работает, даже если единственная перегрузка Enumerable.Range принимает параметры int ;-)
Это не сработает для языков, в которых есть буквы, коды ASCII которых выходят за пределы диапазона "a" - "z". Вы не можете использовать этот метод в таких случаях. В остальном хорошее решение.
Михал Б.
58
for (char letter = 'A'; letter <= 'Z'; letter++)
{
Debug.WriteLine(letter);
}
Я думаю, что это лучшее решение, потому что вы можете использовать этот метод для создания массива целых чисел и строчных букв. Это должен быть принятый ответ :)
Kapé
У @PopCatalin сначала был правильный ответ, но я выбрал именно такой подход. Немного легче следить за тем, что происходит, и единственная информация, которую, как предполагается, вы знаете, - это то, что алфавит состоит из 26 символов ('A' ... 'Z'), что я считаю разумным.
Mass Dot Net
22
Я написал это, чтобы получить код столбца MS Excel (A, B, C, ..., Z, AA, AB, ..., ZZ, AAA, AAB, ...) на основе индекса на основе 1. (Конечно, переход на нулевой отсчет - это просто отказ от column--;начального значения.)
Эй, просто замена Convert.ToStringна String.valueOfзаставляет его работать на Java :)
Ньергудс
1
Как насчет getIndexFromColumnName?
oneiros
14
Предполагая, что вы имеете в виду буквы английского алфавита ...
for ( int i = 0; i < 26; i++ )
{
Console.WriteLine( Convert.ToChar( i + 65 ) );
}
Console.WriteLine( "Press any key to continue." );
Console.ReadKey();
Лучше использовать (int) 'A' вместо жесткого кодирования 65. Это сделает код более читабельным и менее подверженным ошибкам.
Mehrdad Afshari
Однако в ведущей кодировке, где 'A'! = 65, (EBCDIC), символы от A до Z не являются последовательными.
Джеймс Карран
5
Мне не кажется, что это массив.
Гонки легкости на орбите
@MehrdadAfshari Внутренняя кодировка не имеет значения. Что это отношение является то , что значения типа Char являются Unicode кодовых точек, и те являются AZ последовательны.
Nyerguds
8
Вы можете сделать что-то вроде этого, основываясь на значениях ascii символов:
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
}
(См. Таблицу здесь .) Вы просто выполняете преобразование из значения int символа в значение символа - но это работает только для символов ascii, а не для разных языков и т. Д.
РЕДАКТИРОВАТЬ:
Как было предложено Мехрдадом в комментарии к аналогичному решению, лучше сделать это:
alphabet[i] = (char)(i+(int)('A'));
Это приводит к преобразованию символа A в его значение int, а затем увеличивает его, так что это не жестко запрограммировано.
В этом коде есть небольшая ошибка. i = от 0 до <27 включает 27 букв (элемент массива 0, затем элементы с 1 по 26).
Брайан
Вы можете сделать его еще лучше: алфавит [i] = (char) (i + 'A'); Тот же результат
CasperT
1
Не должно быть char[] alphabet = new char[26];?
Шишир Гупта
5
Также обратите внимание, что строка имеет оператор [], который возвращает Char, и является IEnumerable<char>, поэтому для большинства целей вы можете использовать строку как char []. Отсюда:
string alpha = "ABCDEFGHIJKLMNOPQRSTUVQXYZ";
for (int i =0; i < 26; ++i)
{
Console.WriteLine(alpha[i]);
}
foreach(char c in alpha)
{
Console.WriteLine(c);
}
Красиво, но это довольно странный способ написания forцикла.
Nyerguds
@Nyerguds, если вы имеете в виду yield returnчасть, на самом деле это не эквивалент цикла for. Он таков, что с его помощью можно лениво возвращать бесконечную серию.
Weston
Нет, я имею в виду тот факт, что у вас есть whileсчетчик, который увеличивает каждый ход и заканчивается на фиксированном значении. Это именно то, что forбыло призвано заменить.
Nyerguds
Я понимаю, что вы имеете ввиду. Можно использовать там цикл for. Это было 4 года назад, так сложно объяснить, почему я этого не сделал!
Weston
2
var alphabets = Enumerable.Range('A', 26).Select((num) => ((char)num).ToString()).ToList();
Похоже, вы не научились использовать правильные кавычки для символов. Нет причин разбирать это из строки; просто используйте char alphaStart = 'A';одинарные кавычки вместо двойных.
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)
{
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++;
}
Ответы:
Я не думаю, что есть встроенный способ, но я думаю, что проще всего было бы
char[] alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
источник
С # 3.0:
char[] az = Enumerable.Range('a', 'z' - 'a' + 1).Select(i => (Char)i).ToArray(); foreach (var c in az) { Console.WriteLine(c); }
да, он работает, даже если единственная перегрузка Enumerable.Range принимает параметры int ;-)
источник
String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));
возвращаетсяABCDEFGHIJKLMNOPQRSTUVWXYZ
;Enumerable.Range('a', 26)
for (char letter = 'A'; letter <= 'Z'; letter++) { Debug.WriteLine(letter); }
источник
char[] alphabet = Enumerable.Range('A', 26).Select(x => (char)x).ToArray();
источник
Я написал это, чтобы получить код столбца MS Excel (A, B, C, ..., Z, AA, AB, ..., ZZ, AAA, AAB, ...) на основе индекса на основе 1. (Конечно, переход на нулевой отсчет - это просто отказ от
column--;
начального значения.)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; }
источник
Convert.ToString
наString.valueOf
заставляет его работать на Java :)Предполагая, что вы имеете в виду буквы английского алфавита ...
for ( int i = 0; i < 26; i++ ) { Console.WriteLine( Convert.ToChar( i + 65 ) ); } Console.WriteLine( "Press any key to continue." ); Console.ReadKey();
источник
Вы можете сделать что-то вроде этого, основываясь на значениях ascii символов:
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 }
(См. Таблицу здесь .) Вы просто выполняете преобразование из значения int символа в значение символа - но это работает только для символов ascii, а не для разных языков и т. Д.
РЕДАКТИРОВАТЬ: Как было предложено Мехрдадом в комментарии к аналогичному решению, лучше сделать это:
alphabet[i] = (char)(i+(int)('A'));
Это приводит к преобразованию символа A в его значение int, а затем увеличивает его, так что это не жестко запрограммировано.
источник
char[] alphabet = new char[26];
?Также обратите внимание, что строка имеет оператор [], который возвращает Char, и является
IEnumerable<char>
, поэтому для большинства целей вы можете использовать строку как char []. Отсюда:string alpha = "ABCDEFGHIJKLMNOPQRSTUVQXYZ"; for (int i =0; i < 26; ++i) { Console.WriteLine(alpha[i]); } foreach(char c in alpha) { Console.WriteLine(c); }
источник
Удивлен, что никто не предложил решения для повышения урожайности:
public static IEnumerable<char> Alphabet() { for (char letter = 'A'; letter <= 'Z'; letter++) { yield return letter; } }
Пример:
foreach (var c in Alphabet()) { Console.Write(c); }
источник
for
цикла.yield return
часть, на самом деле это не эквивалент цикла for. Он таков, что с его помощью можно лениво возвращать бесконечную серию.while
счетчик, который увеличивает каждый ход и заканчивается на фиксированном значении. Это именно то, чтоfor
было призвано заменить.var alphabets = Enumerable.Range('A', 26).Select((num) => ((char)num).ToString()).ToList();
источник
char alphaStart = Char.Parse("A"); char alphaEnd = Char.Parse("Z"); for(char i = alphaStart; i <= alphaEnd; i++) { string anchorLetter = i.ToString(); }
источник
char alphaStart = 'A';
одинарные кавычки вместо двойных.//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++; }
источник
if
иwhile
отчетности)4 способа получить английский алфавит в консоли:
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()}"); } }
источник
К сожалению, готового способа нет.
Ты можешь использовать; char [] characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();
источник