Menghasilkan array huruf dalam alfabet

92

Apakah ada cara mudah untuk menghasilkan array yang berisi huruf-huruf alfabet di C #? Tidak terlalu sulit untuk melakukannya dengan tangan, tetapi saya bertanya-tanya apakah ada cara yang dibangun untuk melakukan ini.

Hel elephant
sumber
FYI, pertanyaan ini sudah pernah ditanyakan sebelumnya dengan mempertimbangkan internasionalisasi.
Serge Wautier
7
Bukan hanya salah satu pertanyaan di mana saya bertanya-tanya apakah ada cara yang lebih baik. :)
Hel elephant
Kebalikannya dapat ditemukan di sini stackoverflow.com/a/667902/2343
Sameer Alibhai

Jawaban:

197

Saya tidak berpikir ada cara yang dibangun, tapi saya pikir yang termudah adalah

  char[] alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
Bob
sumber
7
Ini juga berfungsi pada alfabet lain, selama Anda menempatkan string di Resource :)
Olmo
1
Ini adalah cara terbaik jika Anda ingin memastikan bahwa kode Anda berfungsi pada mesin dengan bahasa berbeda. Jika tidak, jika Anda membuat alfabet Anda secara dinamis (seperti jawaban lain di bawah), Anda dapat mengakhiri dengan alfabet yang berbeda di mesin yang berbeda.
Luis
Bagaimana cara kerjanya dengan bahasa yang berbeda? Akankah ini entah bagaimana secara ajaib berisi huruf Cina, atau huruf dari bahasa lain?
Paweł Audionysos
104

C # 3.0:

char[] az = Enumerable.Range('a', 'z' - 'a' + 1).Select(i => (Char)i).ToArray();
foreach (var c in az)
{
    Console.WriteLine(c);
}

ya itu berhasil bahkan jika satu-satunya kelebihan Enumerable.Range menerima parameter int ;-)

Pop Catalin
sumber
'z' - 'a' + 1 = Kelihatannya sangat kikuk, tapi saya tidak bisa melihat jalan lain :(
CasperT
String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));kembali ABCDEFGHIJKLMNOPQRSTUVWXYZ;
abatishchev
15
@CasperT: MungkinEnumerable.Range('a', 26)
abatishchev
Ini tidak akan berfungsi untuk bahasa yang memiliki huruf yang kode ASCII-nya berada di luar rentang 'a' - 'z'. Anda tidak dapat menggunakan metode ini dalam kasus seperti itu. Solusi bagus sebaliknya.
Michal B.
58
for (char letter = 'A'; letter <= 'Z'; letter++)
{
     Debug.WriteLine(letter);
}
Simon
sumber
37
char[] alphabet = Enumerable.Range('A', 26).Select(x => (char)x).ToArray();
Raz Megrelidze
sumber
3
Saya rasa ini adalah solusi terbaik karena Anda dapat menggunakan metode ini untuk membuat array bilangan bulat dan huruf kecil juga. Ini harus menjadi jawaban yang diterima :)
Kapé
@PopCatalin memiliki jawaban yang benar terlebih dahulu, tetapi ini adalah pendekatan yang saya gunakan. Agak lebih mudah untuk mengikuti apa yang sedang terjadi, dan satu-satunya informasi yang diasumsikan Anda tahu adalah bahwa alfabet berisi 26 karakter ('A' .. 'Z'), yang menurut saya masuk akal.
Mass Dot Net
22

Saya menulis ini untuk mendapatkan kode kolom MS excel (A, B, C, ..., Z, AA, AB, ..., ZZ, AAA, AAB, ...) berdasarkan indeks berbasis 1. (Tentu saja, beralih ke berbasis nol hanya berhenti column--;di awal.)

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;
}
Nyerguds
sumber
2
Oh hey, hanya mengganti Convert.ToStringdengan String.valueOfmembuatnya berfungsi di Java :)
Nyerguds
1
Bagaimana dengan getIndexFromColumnName?
oneiros
14

Dengan asumsi yang Anda maksud adalah huruf-huruf alfabet bahasa Inggris ...

    for ( int i = 0; i < 26; i++ )
    {
        Console.WriteLine( Convert.ToChar( i + 65 ) );
    }
    Console.WriteLine( "Press any key to continue." );
    Console.ReadKey();
rp.
sumber
9
Lebih baik menggunakan (int) 'A' daripada hardcode 65. Ini akan membuat kode lebih mudah dibaca dan tidak terlalu rentan terhadap kesalahan.
Mehrdad Afshari
Namun, dalam pengkodean utama di mana 'A'! = 65, (EBCDIC), A ke Z tidak berurutan.
James Curran
5
Tidak terlihat seperti array bagi saya.
Balapan Lightness di Orbit
@MehrdadAfshari Pengkodean yang digunakan secara internal tidak relevan. Apa yang relevan adalah bahwa nilai-nilai dari jenis Char adalah kode Unicode poin, dan orang-orang yang AZ berurutan.
Nyerguds
8

Anda bisa melakukan sesuatu seperti ini, berdasarkan nilai ascii dari karakter:

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
}

(Lihat tabel di sini .) Anda baru saja mentransmisikan dari nilai int karakter ke nilai karakter - tetapi, itu hanya berfungsi untuk karakter ascii bukan bahasa yang berbeda, dll.

EDIT: Seperti yang disarankan oleh Mehrdad di komentar untuk solusi serupa, lebih baik melakukan ini:

alphabet[i] = (char)(i+(int)('A'));

Ini mentransmisikan karakter A ke nilai intnya dan kemudian meningkatkannya berdasarkan ini, jadi tidak di-hardcode.

xan
sumber
Kode ini memiliki kesalahan kecil. i = 0 hingga <27 menyertakan 27 huruf (elemen array 0, lalu elemen 1 hingga 26).
Brian
Anda dapat membuatnya lebih baik: alfabet [i] = (char) (i + 'A'); Hasil yang sama
CasperT
1
Bukankah seharusnya begitu char[] alphabet = new char[26];?
Shishir Gupta
5

Perhatikan juga, string memiliki operator [] yang mengembalikan Char, dan merupakan IEnumerable<char>, jadi untuk sebagian besar tujuan, Anda dapat menggunakan string sebagai char []. Karenanya:

string alpha = "ABCDEFGHIJKLMNOPQRSTUVQXYZ";
for (int i =0; i < 26; ++i)
{  
     Console.WriteLine(alpha[i]);
}

foreach(char c in alpha)
{  
     Console.WriteLine(c);
}
James Curran
sumber
3

Terkejut tidak ada yang menyarankan solusi hasil:

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

Contoh:

foreach (var c in Alphabet())
{
    Console.Write(c);
}
weston
sumber
Bagus, tapi itu cara yang aneh untuk menulis satu forlingkaran.
Nyerguds
@Nyerguds jika yang Anda maksud adalah yield returnbagian, itu tidak benar-benar setara dengan for loop. Ini sedemikian rupa sehingga dapat digunakan untuk mengembalikan deret tak hingga dengan malas.
barat
Tidak, maksud saya fakta Anda memiliki whilepenghitung yang menaikkan setiap belokan dan berakhir pada nilai tetap. Itulah tepatnyafor dirancang untuk diganti.
Nyerguds
Saya mengerti apa yang kamu maksud. Bisa menggunakan for loop di sana. Itu 4 tahun yang lalu, sangat sulit untuk menjelaskan mengapa saya tidak melakukannya!
barat
2
var alphabets = Enumerable.Range('A', 26).Select((num) => ((char)num).ToString()).ToList();
Pradeep TM
sumber
0
char alphaStart = Char.Parse("A");
char alphaEnd = Char.Parse("Z");
for(char i = alphaStart; i <= alphaEnd; i++) {
    string anchorLetter = i.ToString();
}
A A.
sumber
Sepertinya Anda belum belajar bagaimana menggunakan kutipan yang benar untuk karakter. Tidak ada alasan untuk menguraikannya dari string; gunakan saja char alphaStart = 'A';, dengan tanda kutip tunggal, bukan tanda kutip ganda.
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.dll
sumber
pemformatan tetap, tetapi kode tampaknya tidak lengkap (lihat pernyataan ifdan while)
Oliver
1
Woah, rekursi untuk sesuatu yang sederhana? Anda dapat melakukannya dengan While sederhana, dan membaginya dengan 26.
Nyerguds
0

4 cara mendapatkan alfabet Inggris di Konsol:

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()}");
    }
}
Paul Alexeev
sumber
Meskipun ini adalah solusi, berikan lebih banyak informasi tentangnya dan apa fungsinya.
George Z.
0

Sayangnya tidak ada cara yang siap pakai.

Kamu bisa memakai; char [] karakter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();

Rick
sumber