生成字母表中的字母数组


91

有没有一种简单的方法来生成包含C#中字母的数组?手工做起来并不难,但是我想知道是否有内置的方法可以做到这一点。


仅供参考,在考虑国际化之前已经问过这个问题
Serge Wautier,

7
我只是想知道是否有更好的方法而已,这些问题只是其中之一。:)
Helephant


相反的地方可以在这​​里找到stackoverflow.com/a/667902/2343
Sameer Alibhai 2012年

Answers:


193

我认为没有内置的方法,但我认为最简单的方法是

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

7
只要将字符串放在Resource中,它也可以在其他字母上工作:)
Olmo

1
如果要确保代码在使用不同语言的机器上运行,这是最好的方法。否则,如果您动态生成字母(如下面的其他答案),则可以在不同的计算机上以不同的字母结尾。
2014年

如何使用不同的语言?这会以某种方式神奇地包含中文字母,还是其他形式的字母?
帕维尔Audionysos

103

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.Range重载接受了int参数,它也有效;-)


'z'-'a'+ 1 =它看起来确实很笨拙,但是我看不出有什么办法:(
CasperT

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

14
@CasperT:可能Enumerable.Range('a', 26)
abatishchev

对于字母的ASCII码超出“ a”-“ z”范围的语言,此功能将不起作用。在这种情况下,您不能使用此方法。否则很好的解决方案。
Michal B.

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

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

3
我认为这是最好的解决方案,因为您也可以使用此方法创建整数和小写字母的数组。这应该是公认的答案:)
康培

@PopCatalin首先有正确的答案,但这是我采用的方法。跟踪正在发生的事情要容易一些,并且它假定您知道的唯一一条信息是字母表包含26个字符(“ A” ..“ Z”),我认为这是合理的。
Mass Dot Net

21

我编写此代码是基于基于1的索引来获取MS excel列代码(A,B,C,...,Z,AA,AB,...,ZZ,AAA,AAB等)。(当然,切换到从零开始只是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.ToStringString.valueOf它在Java中工作使:)
Nyerguds

1
getIndexFromColumnName怎么样?
oneiros'2

13

假设您是指英文字母的字母...

    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'而不是硬编码65。这将使代码更具可读性,并且不易出错。
Mehrdad Afshari

但是,在'A'= 65的前导编码(EBCDIC)中,A到Z不是顺序的。
James Curran

5
在我看来不像一个数组。
轨道轻度竞赛

@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)。
布赖恩

您可以做得更好: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部分,那么它实际上并不等同于for循环。这样就可以用来延迟地返回无限级数。
weston

不,我的意思是说您有一个while带有计数器的计数器,该计数器每转一圈都会递增并以固定值结束。这正是for设计要取代的东西。
Nyerguds

我明白你的意思了。可以在其中使用for循环。那是4年前,很难解释为什么我没有!
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();
}

看来您还没有学会如何对char使用正确的引号。没有理由从字符串中解析它;只需使用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++;
    }

固定格式,但代码似乎不完整(请看ifand while语句)
Oliver 2010年

1
哇,递归这么简单?你可以做一个简单的同时,和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()}");
    }
}

即使这是一个解决方案,也请提供有关它及其作用的更多信息。
乔治Z.19年

0

不幸的是,没有现成的方法。

您可以使用; char []个字符=“ ABCDEFGHIJKLMNOPQRSTUVWXYZ” .ToCharArray();

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.