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.