Generowanie tablicy liter alfabetu


92

Czy istnieje łatwy sposób na wygenerowanie tablicy zawierającej litery alfabetu w języku C #? Nie jest to trudne do zrobienia ręcznie, ale zastanawiałem się, czy nie ma wbudowanego sposobu, aby to zrobić.


FYI, to pytanie zostało już zadane z myślą o internacjonalizacji.
— Serge Wautier

7
Nie, tylko jedno z tych pytań, na które zastanawiałem się, czy istnieje lepszy sposób. :)
— Helephant


Odwrotną stronę można znaleźć tutaj stackoverflow.com/a/667902/2343
— Sameer Alibhai

Odpowiedzi:


197

Nie sądzę, aby istniała wbudowana droga, ale myślę, że najłatwiej byłoby

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

7
Działa również na innych alfabetach, o ile umieścisz ciąg w zasobie :)
— Olmo

1
Jest to najlepszy sposób, jeśli chcesz mieć pewność, że Twój kod działa na maszynach z różnymi językami. W przeciwnym razie, jeśli generujesz swój alfabet dynamicznie (jak inne odpowiedzi poniżej), możesz zakończyć z innym alfabetem na różnych maszynach.
— Luis

Jak to działa w różnych językach? Czy w jakiś magiczny sposób będzie to zawierało chińskie litery, czy litery z innych języków?
— 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);
}

tak, to działa, nawet jeśli jedyne przeciążenie Enumerable.Range akceptuje parametry int ;-)


'z' - 'a' + 1 = Wygląda po prostu niezgrabnie, ale nie widzę sposobu, aby to obejść :(
— CasperT,

String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));zwroty ABCDEFGHIJKLMNOPQRSTUVWXYZ;
— abatishchev

15
@CasperT: PrawdopodobnieEnumerable.Range('a', 26)
— abatishchev

To nie zadziała dla języków, które mają litery, których kody ASCII wykraczają poza zakres „a” - „z”. W takich przypadkach nie można użyć tej metody. W przeciwnym razie fajne rozwiązanie.
— Michał B.

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

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

3
Myślę, że jest to najlepsze rozwiązanie, ponieważ możesz użyć tej metody do tworzenia tablicy liczb całkowitych i małych liter. To powinna być akceptowana odpowiedź :)
— Kapé

@PopCatalin najpierw miał poprawną odpowiedź, ale to jest podejście, które wybrałem. Trochę łatwiej jest śledzić, co się dzieje, a jedyną informacją, o której zakładamy, że wiesz, jest to, że alfabet zawiera 26 znaków („A”… „Z”), co moim zdaniem jest rozsądne.
— Mass Dot Net

22

Napisałem to, aby uzyskać kod kolumny MS Excel (A, B, C, ..., Z, AA, AB, ..., ZZ, AAA, AAB, ...) w oparciu o indeks oparty na 1. (Oczywiście przejście na zero to po prostu pominięcie column--;na początku.)

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
Oh hej, tylko wymianie Convert.ToStringz String.valueOfsprawia, że pracują w Javie :)
— Nyerguds

1
A co z getIndexFromColumnName?
— oneiros

14

Zakładając, że masz na myśli litery alfabetu angielskiego ...

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

9
Lepiej jest użyć (int) „A” zamiast twardego kodowania 65. Dzięki temu kod będzie bardziej czytelny i mniej podatny na błędy.
— Mehrdad Afshari

Jednak w wiodącym kodowaniu, w którym „A”! = 65, (EBCDIC), A do Z nie są sekwencyjne.
— James Curran,

5
Nie wygląda mi to na tablicę.
— Wyścigi lekkości na orbicie

@MehrdadAfshari Kodowanie używane wewnętrznie jest nieistotne. Co jest istotne to, że wartości typu char są Unicode punkty kodowe, a te są AZ sekwencyjny.
— Nyerguds

8

Możesz zrobić coś takiego, w oparciu o wartości ascii postaci:

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
}

(Zobacz tabelę tutaj .) Po prostu dokonujesz rzutowania z wartości int znaku na wartość znaku - ale to działa tylko dla znaków ascii, a nie dla różnych języków itp.

EDYCJA: Jak sugeruje Mehrdad w komentarzu do podobnego rozwiązania, lepiej to zrobić:

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

To rzutuje znak A na jego wartość int, a następnie zwiększa na tej podstawie, więc nie jest zakodowany na stałe.


Ten kod zawiera drobny błąd. i = 0 do <27 zawiera 27 liter (element tablicy 0, następnie elementy 1 do 26).
— Brian

Możesz zrobić to jeszcze lepiej: alfabet [i] = (znak) (i + 'A'); Ten sam wynik
— CasperT

1
Nie powinno być char[] alphabet = new char[26];?
— Shishir Gupta

5

Zauważ również, że łańcuch ma operator [], który zwraca znak Char i jest nim IEnumerable<char>, więc w większości przypadków możesz użyć łańcucha jako znaku []. W związku z tym:

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

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

3

Zaskoczony, nikt nie zaproponował rozwiązania w zakresie wydajności:

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

Przykład:

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

Fajnie, ale to dziwaczny sposób pisania forpętli.
— Nyerguds

@Nyerguds, jeśli masz na myśli yield returnczęść, nie jest to odpowiednik pętli for. Jest tak, że można by go użyć do leniwego powrotu nieskończonej serii.
— weston

Nie, mam na myśli fakt, że masz whilelicznik, który zwiększa się w każdej turze i kończy na ustalonej wartości. Właśnie to forzostało zaprojektowane, aby zastąpić.
— Nyerguds

Rozumiem, co masz na myśli. Przydałaby się pętla for. To było 4 lata temu, więc trudno wyjaśnić, dlaczego tego nie zrobiłem!
— 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();
}

Wygląda na to, że nie nauczyłeś się używać poprawnych cudzysłowów dla znaków. Nie ma powodu, aby analizować to z łańcucha; po prostu użyj char alphaStart = 'A';, używając pojedynczych cudzysłowów zamiast podwójnych cudzysłowów.
— 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++;
    }

poprawione formatowanie, ale kod wydaje się niekompletny (spójrz na instrukcje ifi while)
— Oliver

1
Woah, rekurencja dla czegoś tak prostego? Możesz to zrobić za pomocą prostego While i podzielenia przez 26.
— Nyerguds

0

4 sposoby na uzyskanie alfabetu angielskiego w konsoli:

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

Nawet jeśli jest to rozwiązanie, podaj więcej informacji na jego temat i do czego służy.
— George Z.

0

Niestety nie ma gotowego sposobu.

Możesz użyć; char [] znaków = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.