C# 递增字母表

C# 递增字母表,c#,alphabet,C#,Alphabet,我正在尝试创建一个函数,当传递索引时,该函数将为我提供字母表位置。它将与excel显示其列的方式相同。A…Z,AA,AB。。。。我编写了下面的函数来得到Z的结果 static string GetColumnName(int index) { const int alphabetsCount = 26; if (index <= alphabetsCount) { int code = (index - 1) + (int)'A';

我正在尝试创建一个函数,当传递索引时,该函数将为我提供字母表位置。它将与excel显示其列的方式相同。A…Z,AA,AB。。。。我编写了下面的函数来得到Z的结果

static string GetColumnName(int index)
{
    const int alphabetsCount = 26;
    if (index <= alphabetsCount)
    {
        int code = (index - 1) + (int)'A';
        return char.ConvertFromUtf32(code);
    }
    return string.Empty;
}

递归是一种可能性——如果
index>26
,则在此调用中处理
index%26
,并将其连接到
index/26
上的递归调用。然而,对于像这样的简单情况,迭代通常更快,也不难安排。在伪代码中:

string result = <convert `index % 26`>
while index > 26:
  index = index / 26
  result = <convert `index % 26`> + result
return result
字符串结果=
当指数>26时:
指数=指数/26
结果=+结果
返回结果
等等

static string GetColumnName(int index) { const int alphabetsCount = 26; string result = ''; if (index >= alphabetsCount) { result += GetColumnName(index-alphabetsCount) } return (string) (64 + index); } 静态字符串GetColumnName(int索引) { 常量int字母计数=26; 字符串结果=“”; 如果(索引>=字母计数) { 结果+=GetColumnName(索引字母计数) } 返回(字符串)(64+索引); } 我的C#又可怕又生锈。将其解释为伪代码-它几乎肯定不会编译,但可能会让您开始使用。

请参见以下问题:

或者这个:


尽管第一个链接在顶部有一个正确答案,第二个链接有几个不正确的答案。

任何递归函数都可以转换为等效的迭代函数。我发现首先递归思考总是很容易的:

static string GetColumnName(int index)
{
    const int alphabetsCount = 26;

    if (index > alphabetsCount) {
        return GetColumnName(index / alphabetsCount) + GetColumnName(index % alphabetsCount);
    } else {
        int code = (index - 1) + (int)'A';
        return char.ConvertFromUtf32(code);
    }
}
可以简单地转换为:

static string GetColumnName(int index)
{
    const int alphabetsCount = 26;
    string result = string.Empty;

    while (index > 0) {
        result = char.ConvertFromUtf32(64 + (index % alphabetsCount)) + result;
        index /= alphabetsCount;
    }

    return result;
}

即便如此,听Joel说。

我不想用C#来回答这个问题,但我要告诉你在Haskell中这是多么容易

alphas :: [String]
alphas = [x ++ [c] | x <- ([]:alphas), c <- ['A'..'Z']]

Prelude> take 100 alphas
["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T",
 "U","V","W","X","Y","Z","AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK",
 "AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ","BA",
 "BB","BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL","BM","BN","BO","BP","BQ",
 "BR","BS","BT","BU","BV","BW","BX","BY","BZ","CA","CB","CC","CD","CE","CF","CG",
 "CH","CI","CJ","CK","CL","CM","CN","CO","CP","CQ","CR","CS","CT","CU","CV"]
alphas::[String]

alphas=[x++[c]|x伪代码没有问题,但重要的是要知道,如果要在循环中附加到字符串,可能应该使用StringBuilder类来保存对象分配:这是错误的,因为它不是一个基26系统。如果a为0,a将等于AA(0==00)。如果A是1,从Z到AA就像是从9到11。Paul,StringBuilder太过分了。32位int是2^32,26^7溢出,因此最大长度为7个字母。7次迭代几乎不费力。64位的长度只有14个字母。:)太好了。我的数学太生疏了。因此无法计算模运算。谢谢你的代码。
alphas :: [String]
alphas = [x ++ [c] | x <- ([]:alphas), c <- ['A'..'Z']]

Prelude> take 100 alphas
["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T",
 "U","V","W","X","Y","Z","AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK",
 "AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ","BA",
 "BB","BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL","BM","BN","BO","BP","BQ",
 "BR","BS","BT","BU","BV","BW","BX","BY","BZ","CA","CB","CC","CD","CE","CF","CG",
 "CH","CI","CJ","CK","CL","CM","CN","CO","CP","CQ","CR","CS","CT","CU","CV"]