C# 递增字母表
我正在尝试创建一个函数,当传递索引时,该函数将为我提供字母表位置。它将与excel显示其列的方式相同。A…Z,AA,AB。。。。我编写了下面的函数来得到Z的结果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';
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"]