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ć.
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 ;-)
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);
}
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.)
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();
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);
}
@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();
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,...staticstringCharacterIncrement(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++;
}
Odpowiedzi:
Nie sądzę, aby istniała wbudowana droga, ale myślę, że najłatwiej byłoby
char[] alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
źródło
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 ;-)
źródło
String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));
zwrotyABCDEFGHIJKLMNOPQRSTUVWXYZ
;Enumerable.Range('a', 26)
for (char letter = 'A'; letter <= 'Z'; letter++) { Debug.WriteLine(letter); }
źródło
char[] alphabet = Enumerable.Range('A', 26).Select(x => (char)x).ToArray();
źródło
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; }
źródło
Convert.ToString
zString.valueOf
sprawia, że pracują w Javie :)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();
źródło
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.
źródło
char[] alphabet = new char[26];
?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); }
źródło
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); }
źródło
for
pętli.yield return
część, nie jest to odpowiednik pętli for. Jest tak, że można by go użyć do leniwego powrotu nieskończonej serii.while
licznik, który zwiększa się w każdej turze i kończy na ustalonej wartości. Właśnie tofor
zostało zaprojektowane, aby zastąpić.var alphabets = Enumerable.Range('A', 26).Select((num) => ((char)num).ToString()).ToList();
źródło
char alphaStart = Char.Parse("A"); char alphaEnd = Char.Parse("Z"); for(char i = alphaStart; i <= alphaEnd; i++) { string anchorLetter = i.ToString(); }
źródło
char alphaStart = 'A';
, używając pojedynczych cudzysłowów zamiast podwójnych cudzysłowów.//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++; }
źródło
if
iwhile
)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()}"); } }
źródło
Niestety nie ma gotowego sposobu.
Możesz użyć; char [] znaków = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();
źródło