การสร้างอาร์เรย์ของตัวอักษรในตัวอักษร


92

มีวิธีง่ายๆในการสร้างอาร์เรย์ที่มีตัวอักษรใน C # หรือไม่? มันไม่ยากเกินไปที่จะทำด้วยมือ แต่ฉันสงสัยว่ามีวิธีในการทำเช่นนี้หรือไม่


FYI คำถามนี้ถูกถามมาก่อนโดยคำนึงถึงความเป็นสากล
Serge Wautier

7
ไม่ใช่แค่คำถามเดียวที่ฉันสงสัยว่ามีวิธีที่ดีกว่านี้ไหม :)
Helephant


ย้อนกลับได้ที่นี่stackoverflow.com/a/667902/2343
Sameer Alibhai

คำตอบ:


197

ฉันไม่คิดว่าจะมีวิธีการสร้างขึ้น แต่ฉันคิดว่าวิธีที่ง่ายที่สุดน่าจะเป็น

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

7
มันยังใช้งานได้กับตัวอักษรอื่น ๆ ตราบใดที่คุณวางสตริงใน Resource :)
Olmo

1
นี่เป็นวิธีที่ดีที่สุดหากคุณต้องการให้แน่ใจว่าโค้ดของคุณทำงานบนเครื่องที่มีภาษาต่างกัน มิฉะนั้นหากคุณสร้างตัวอักษรแบบไดนามิก (ดังคำตอบอื่น ๆ ด้านล่าง) คุณสามารถลงท้ายด้วยตัวอักษรอื่นในเครื่องอื่นได้
ลุย

สิ่งนี้ทำงานอย่างไรกับภาษาต่างๆ สิ่งนี้จะมีอักษรจีนหรือตัวอักษรในรูปแบบภาษาอื่น ๆ อย่างน่าอัศจรรย์หรือไม่?
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);
}

ใช่มันใช้งานได้แม้ว่าจะมีค่ามากเกินไปเพียงอย่างเดียวของ Enumerable ช่วงยอมรับพารามิเตอร์ int ;-)


'z' - 'a' + 1 = มันดูเงอะงะจริงๆ แต่ฉันมองไม่เห็นทาง :(
CasperT

String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));ผลตอบแทนABCDEFGHIJKLMNOPQRSTUVWXYZ;
abatishchev

15
@CasperT: น่าจะEnumerable.Range('a', 26)
abatishchev

ใช้ไม่ได้กับภาษาที่มีตัวอักษรซึ่งรหัส ASCII อยู่นอกช่วง "a" - "z" คุณไม่สามารถใช้วิธีนี้ในกรณีดังกล่าว ทางออกที่ดีเป็นอย่างอื่น
Michal B.


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 :)
Nyerguds

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' แทน hardcoding 65 ซึ่งจะทำให้โค้ดอ่านง่ายขึ้นและมีโอกาสเกิดข้อผิดพลาดน้อยลง
Mehrdad Afshari

อย่างไรก็ตามในการเข้ารหัสชั้นนำโดยที่ 'A'! = 65, (EBCDIC) A ถึง Z จะไม่เรียงตามลำดับ
James Curran

5
ดูไม่เหมือนอาร์เรย์สำหรับฉัน
Lightness Races ใน Orbit

@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 เท่านั้นไม่ใช่ภาษาอื่น

แก้ไข: ตามที่Mehrdadแนะนำในความคิดเห็นเกี่ยวกับวิธีแก้ปัญหาที่คล้ายกันควรทำดังนี้:

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

สิ่งนี้จะร่ายอักขระ A ให้เป็นค่า int จากนั้นเพิ่มขึ้นตามค่านี้จึงไม่ได้เข้ารหัสแบบแข็ง


รหัสนี้มีข้อผิดพลาดเล็กน้อย i = 0 ถึง <27 ประกอบด้วย 27 ตัวอักษร (องค์ประกอบอาร์เรย์ 0 จากนั้นองค์ประกอบ 1 ถึง 26)
Brian

คุณสามารถทำให้ดีขึ้นได้: alphabet [i] = (char) (i + 'A'); ผลเดียวกัน
CasperT

1
ควรchar[] alphabet = new char[26];หรือไม่?
Shishir Gupta

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ส่วนนี้มันไม่เทียบเท่ากับลูปจริงๆ มันจึงสามารถใช้ในการส่งคืนอนุกรมอนันต์ได้อย่างเฉื่อยชา
weston

ไม่ฉันหมายถึงความจริงที่คุณมีwhileตัวนับที่เพิ่มขึ้นในแต่ละเทิร์นและจบลงด้วยค่าคงที่ นั่นคือสิ่งที่forถูกออกแบบมาเพื่อแทนที่
Nyerguds

ฉันเข้าใจว่าคุณหมายถึงอะไร สามารถใช้สำหรับการวนซ้ำที่นั่น เมื่อ 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ข้อความ)
Oliver

1
ว้าวการเรียกซ้ำเพื่ออะไรง่ายๆอย่างนั้นเหรอ คุณสามารถทำได้โดยใช้ While ง่ายๆและหารด้วย 26
Nyerguds

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

แม้ว่านี่จะเป็นวิธีแก้ปัญหาโปรดให้ข้อมูลเพิ่มเติมเกี่ยวกับวิธีนี้และสิ่งที่ต้องทำ
George Z

0

น่าเสียดายที่ไม่มีวิธีที่พร้อมใช้งาน

คุณสามารถใช้ได้; ถ่าน [] อักขระ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.