Створення масиву літер в алфавіті


91

Чи є простий спосіб створити масив, що містить літери алфавіту в C #? Зробити це вручну не надто складно, але мені було цікаво, чи є для цього вбудований спосіб.


FYI, це питання вже задавались з урахуванням інтернаціоналізації.
Serge Wautier

7
Ні, лише одне з тих питань, де я задався питанням, чи є кращий спосіб. :)
Гелефан,


Реверс можна знайти тут stackoverflow.com/a/667902/2343
Sameer Alibhai

Відповіді:


193

Я не думаю, що існує вбудований спосіб, але я думаю, що це було б найпростіше

  char[] alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();

7
Він також працює на інших алфавітах, якщо ви розміщуєте рядок у ресурсі :)
Олмо,

1
Це найкращий спосіб, якщо ви хочете переконатись, що ваш код працює на машинах з різними мовами. В іншому випадку, якщо ви генеруєте свій алфавіт динамічно (як інші відповіді нижче), ви можете закінчити іншим алфавітом на різних машинах.
Луїс

Як це працює з різними мовами? Чи буде це якимось магічним чином містити китайські літери або букви з інших мов?
Павел Аудіонісос,

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

так, це працює, навіть якщо єдине перевантаження Enumerable.Range приймає параметри int ;-)


'z' - 'a' + 1 = Це просто виглядає по-справжньому незграбно, але я не бачу способу обійти :(
CasperT

String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));повертається ABCDEFGHIJKLMNOPQRSTUVWXYZ;
абатищев

14
@CasperT: ЙмовірноEnumerable.Range('a', 26)
абатищев

Це не буде працювати для мов, що мають літери, коди ASCII яких виходять за межі діапазону 'a' - 'z'. Ви не можете використовувати цей метод у таких випадках. Хороше рішення інакше.
Michal B.


35
char[] alphabet = Enumerable.Range('A', 26).Select(x => (char)x).ToArray();

3
Я думаю, що це найкраще рішення, оскільки ви можете використовувати цей метод для створення масиву цілих чи малих літер. Це має бути прийнятою відповіддю :)
Капе

Спочатку у @PopCatalin була правильна відповідь, але це такий підхід, з яким я пішов. Дещо простіше стежити за тим, що відбувається, і єдиною інформацією, яку він припускає, що ви знаєте, є те, що алфавіт містить 26 символів ("A" .. "Z"), що, на мою думку, є розумним.
Mass Dot Net

21

Я написав це, щоб отримати код стовпця 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 :)
Nyerguds

1
Як щодо getIndexFromColumnName?
oneiros

13

Припускаючи, що ви маєте на увазі букви англійського алфавіту ...

    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. Це зробить код більш читабельним і менш схильним до помилок.
Мехрдад Афшарі,

Однак у кодуванні, що ведуче, де 'A'! = 65, (EBCDIC), A-Z не є послідовними.
Джеймс Керран,

5
Для мене це не схоже на масив.
Гонки легкості на орбіті

@MehrdadAfshari Внутрішньо використовуване кодування не має значення. Важливим є те, що значення типу Char - це кодові точки Юнікоду, а ці значення є послідовними 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, а не для різних мов тощо.

EDIT: Як запропонував Мехрдад у коментарі до подібного рішення, краще зробити це:

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

Зауважте також, що рядок має оператор [], який повертає 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. Він такий, що за допомогою нього можна ліниво повернути нескінченний ряд.
Вестон,

Ні, я маю на увазі той факт, що у вас є 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
Ого, рекурсія чогось такого простого? Ви можете зробити це за допомогою простого Пока, і
діливши

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 [] символи = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.