Tạo một mảng các chữ cái trong bảng chữ cái


91

Có cách nào dễ dàng để tạo một mảng chứa các chữ cái của bảng chữ cái trong C # không? Không quá khó để làm bằng tay, nhưng tôi đang tự hỏi liệu có cách nào được xây dựng để làm điều này không.


FYI, câu hỏi này đã được đặt ra trước đây với tính chất quốc tế hóa.
Serge Wautier

7
Không, chỉ là một trong những câu hỏi mà tôi tự hỏi liệu có cách nào tốt hơn không. :)
Helephant


Điều ngược lại có thể được tìm thấy ở đây stackoverflow.com/a/667902/2343
Sameer Alibhai

Câu trả lời:


193

Tôi không nghĩ rằng có một cách được xây dựng, nhưng tôi nghĩ cách dễ nhất sẽ là

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

7
Nó cũng hoạt động trên bảng chữ cái khác, miễn là bạn đặt các chuỗi trong một Resource :)
Olmo

1
Đây là cách tốt nhất nếu bạn muốn đảm bảo rằng mã của mình hoạt động trên các máy có ngôn ngữ khác nhau. Mặt khác, nếu bạn tạo bảng chữ cái của mình theo cách động (như các câu trả lời khác bên dưới), bạn có thể kết thúc bằng một bảng chữ cái khác trên các máy khác nhau.
Luis

Điều này hoạt động như thế nào với các ngôn ngữ khác nhau? Điều này sẽ bằng cách nào đó một cách kỳ diệu chứa các chữ cái chines, hoặc các chữ cái tạo thành các ngôn ngữ khác?
Paweł Audionysos

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

vâng, nó hoạt động ngay cả khi quá tải duy nhất của Enumerable.Range chấp nhận tham số int ;-)


'z' - 'a' + 1 = Trông nó thực sự vụng về, nhưng tôi không thể nhìn thấy cách xung quanh nó :(
CasperT

String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));trả lại ABCDEFGHIJKLMNOPQRSTUVWXYZ;
abatishchev

14
@CasperT: Có thểEnumerable.Range('a', 26)
abatishchev

Điều này sẽ không hoạt động đối với các ngôn ngữ có các chữ cái có mã ASCII nằm ngoài phạm vi 'a' - 'z'. Bạn không thể sử dụng phương pháp này trong những trường hợp như vậy. Giải pháp tốt đẹp khác.
Michal B.

57
for (char letter = 'A'; letter <= 'Z'; letter++)
{
     Debug.WriteLine(letter);
}

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

3
Tôi nghĩ đây là giải pháp tốt nhất vì bạn cũng có thể sử dụng phương pháp này để tạo một mảng các số nguyên và chữ thường. Đây phải là câu trả lời được chấp nhận :)
Kapé

@PopCatalin đã có câu trả lời chính xác trước tiên, nhưng đây là cách tiếp cận mà tôi đã áp dụng. Sẽ dễ dàng hơn một chút để theo dõi những gì đang diễn ra và thông tin duy nhất mà nó cho rằng bạn biết là bảng chữ cái chứa 26 ký tự ('A' .. 'Z'), mà tôi tin là hợp lý.
Mass Dot Net

21

Tôi viết cái này để lấy mã cột MS excel (A, B, C, ..., Z, AA, AB, ..., ZZ, AAA, AAB, ...) dựa trên chỉ số 1-based. (Tất nhiên, chuyển sang dựa trên số 0 chỉ đơn giản là bỏ qua column--;ngay từ đầu.)

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
Ồ này, chỉ cần thay thế Convert.ToStringbằng String.valueOflàm cho nó hoạt động trong Java :)
Nyerguds

1
Còn getIndexFromColumnName thì sao?
oneiros

13

Giả sử ý bạn là các chữ cái trong bảng chữ cái tiếng Anh ...

    for ( int i = 0; i < 26; i++ )
    {
        Console.WriteLine( Convert.ToChar( i + 65 ) );
    }
    Console.WriteLine( "Press any key to continue." );
    Console.ReadKey();

9
Tốt hơn nên sử dụng (int) 'A' thay vì mã cứng 65. Nó sẽ làm cho mã dễ đọc hơn và ít bị lỗi hơn.
Mehrdad Afshari

Tuy nhiên, trong bảng mã hàng đầu có 'A'! = 65, (EBCDIC), A đến Z không theo thứ tự.
James Curran

5
Đối với tôi không giống như một mảng.
Lightness Races in Orbit

@MehrdadAfshari Mã hóa được sử dụng nội bộ không liên quan. Điều liên quan là các giá trị của loại Char là các điểm mã Unicode và chúng là tuần tự AZ.
Nyerguds

8

Bạn có thể làm điều gì đó như thế này, dựa trên các giá trị ascii của các ký tự:

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
}

(Xem bảng ở đây .) Bạn chỉ đang truyền từ giá trị int của ký tự sang giá trị ký tự - nhưng, điều đó chỉ hoạt động đối với các ký tự ascii không phải các ngôn ngữ khác nhau, v.v.

CHỈNH SỬA: Theo đề xuất của Mehrdad trong nhận xét cho một giải pháp tương tự, tốt hơn nên làm điều này:

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

Điều này chuyển ký tự A thành giá trị int của nó và sau đó tăng lên dựa trên điều này, vì vậy nó không được mã hóa cứng.


Mã này có một lỗi nhỏ. i = 0 đến <27 bao gồm 27 chữ cái (mảng phần tử 0, sau đó là phần tử 1 đến 26).
Brian

Bạn có thể làm cho nó tốt hơn nữa: alphabet [i] = (char) (i + 'A'); Kết quả tương tự
CasperT

1
Có nên không char[] alphabet = new char[26];?
Shishir Gupta

5

Cũng lưu ý rằng, chuỗi có một toán tử [] trả về một Char và là một IEnumerable<char>, vì vậy đối với hầu hết các mục đích, bạn có thể sử dụng một chuỗi như một char []. Vì thế:

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

foreach(char c in alpha)
{  
     Console.WriteLine(c);
}

3

Ngạc nhiên là không ai đề xuất giải pháp lợi nhuận:

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

Thí dụ:

foreach (var c in Alphabet())
{
    Console.Write(c);
}

Tốt, nhưng đó là một cách kỳ lạ về cơ bản để viết một forvòng lặp.
Nyerguds

@Nyerguds nếu ý bạn là yield returnmột phần, nó không thực sự tương đương với vòng lặp for. Nó có thể được sử dụng để trả về một chuỗi vô hạn một cách lười biếng.
weston

Không, ý tôi là thực tế là bạn có một whilebộ đếm tăng lên mỗi lượt và kết thúc ở một giá trị cố định. Đó chính xác là những gì forđược thiết kế để thay thế.
Nyerguds

Tôi hiểu ý bạn là gì. Có thể sử dụng vòng lặp for ở đó. Đó là 4 năm trước, thật khó để giải thích tại sao tôi không!
weston

2
var alphabets = Enumerable.Range('A', 26).Select((num) => ((char)num).ToString()).ToList();

0
char alphaStart = Char.Parse("A");
char alphaEnd = Char.Parse("Z");
for(char i = alphaStart; i <= alphaEnd; i++) {
    string anchorLetter = i.ToString();
}

Có vẻ như bạn chưa học được cách sử dụng các dấu ngoặc kép chính xác cho các ký tự. Không có lý do gì để phân tích cú pháp đó từ chuỗi; chỉ sử dụng char alphaStart = 'A';, với dấu nháy đơn thay vì dấu nháy kép.
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++;
    }

cố định định dạng, nhưng mã có vẻ là không đầy đủ (hãy nhìn vào sự ifwhilebáo cáo)
Oliver

1
Woah, đệ quy cho một cái gì đó đơn giản? Bạn có thể làm điều đó với một Trong khi đơn giản, và chia cho 26.
Nyerguds

0

4 cách nhận bảng chữ cái tiếng Anh trong Console:

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

Ngay cả khi đây là một giải pháp, vui lòng cung cấp thêm thông tin về nó và chức năng của nó.
George Z.

0

Thật không may là không có cách nào sẵn sàng để sử dụng.

Bạn có thể dùng; char [] character = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.