Создание массива букв в алфавите

92

Есть ли простой способ создать массив, содержащий буквы алфавита в C #? Это не так уж сложно сделать вручную, но мне было интересно, есть ли встроенный способ сделать это.

Слон
источник
К вашему сведению, этот вопрос задавался ранее с учетом интернационализации.
Серж Вотье
7
Нет, это только один из тех вопросов, где я подумал, есть ли лучший способ. :)
Helephant
Обратное можно найти здесь stackoverflow.com/a/667902/2343
Самир Алибхай,

Ответы:

197

Я не думаю, что есть встроенный способ, но я думаю, что проще всего было бы

  char[] alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
Боб
источник
7
Он также работает с другими алфавитами, если вы помещаете строку в Ресурс :)
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 ;-)

Поп-каталин
источник
'z' - 'a' + 1 = Это выглядит очень неуклюже, но я не вижу способа обойти это :(
CasperT
String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));возвращается ABCDEFGHIJKLMNOPQRSTUVWXYZ;
Абатищев
15
@CasperT: Наверное,Enumerable.Range('a', 26)
абатищев
Это не сработает для языков, в которых есть буквы, коды ASCII которых выходят за пределы диапазона "a" - "z". Вы не можете использовать этот метод в таких случаях. В остальном хорошее решение.
Михал Б.
58
for (char letter = 'A'; letter <= 'Z'; letter++)
{
     Debug.WriteLine(letter);
}
Саймон
источник
37
char[] alphabet = Enumerable.Range('A', 26).Select(x => (char)x).ToArray();
Раз Мегрелидзе
источник
3
Я думаю, что это лучшее решение, потому что вы можете использовать этот метод для создания массива целых чисел и строчных букв. Это должен быть принятый ответ :)
Kapé
У @PopCatalin сначала был правильный ответ, но я выбрал именно такой подход. Немного легче следить за тем, что происходит, и единственная информация, которую, как предполагается, вы знаете, - это то, что алфавит состоит из 26 символов ('A' ... 'Z'), что я считаю разумным.
Mass Dot Net
22

Я написал это, чтобы получить код столбца 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;
}
Нергудс
источник
2
Эй, просто замена 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();
рп.
источник
9
Лучше использовать (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, а затем увеличивает его, так что это не жестко запрограммировано.

xan
источник
В этом коде есть небольшая ошибка. 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);
}
Джеймс Карран
источник
3

Удивлен, что никто не предложил решения для повышения урожайности:

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

Пример:

foreach (var c in Alphabet())
{
    Console.Write(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();
Pradeep TM
источник
0
char alphaStart = Char.Parse("A");
char alphaEnd = Char.Parse("Z");
for(char i = alphaStart; i <= alphaEnd; i++) {
    string anchorLetter = i.ToString();
}
аа
источник
Похоже, вы не научились использовать правильные кавычки для символов. Нет причин разбирать это из строки; просто используйте 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,...

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
источник
Исправлено форматирование, но код кажется неполным (обратите внимание на ту ifи whileотчетности)
Оливер
1
Вау, рекурсия для чего-то такого простого? Вы можете сделать это с помощью простого while и деления на 26.
Нергудс
0

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()}");
    }
}
Павел Алексеев
источник
Даже если это решение, пожалуйста, предоставьте дополнительную информацию о нем и о том, что оно делает.
Джордж З.
0

К сожалению, готового способа нет.

Ты можешь использовать; char [] characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();

Рик
источник