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


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". Вы не можете использовать этот метод в таких случаях. В остальном хорошее решение.
Михал Б.


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, а затем увеличивает его, так что это не жестко запрограммировано.


В этом коде есть небольшая ошибка. 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


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

Исправлено форматирование, но код кажется неполным (обратите внимание на ту 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 ();

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.