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ć.

Helephant
źródło
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();
Pion
źródło
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 ;-)

Pop Catalin
źródło
'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);
}
Szymon
źródło
37
char[] alphabet = Enumerable.Range('A', 26).Select(x => (char)x).ToArray();
Raz Megrelidze
źródło
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;
}
Nyerguds
źródło
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();
rp.
źródło
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.

xan
źródło
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);
}
James Curran
źródło
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);
}
Weston
źródło
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();
Pradeep TM
źródło
0
char alphaStart = Char.Parse("A");
char alphaEnd = Char.Parse("Z");
for(char i = alphaStart; i <= alphaEnd; i++) {
    string anchorLetter = i.ToString();
}
aa.
źródło
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++;
    }
rjdmello
źródło
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()}");
    }
}
Paul Alexeev
źródło
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 ();

Stóg
źródło