インデックスが渡されたときにアルファベットの位置を取得する関数を作成しようとしています。これは、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;
}
これは「Z」まで正常に機能します。1を渡すと「A」を返し、2を渡すと「B」を返します。しかし、この関数に27を渡すと、AAがどのように取得されるのかわかりません。それを見つけるには再帰的な方法が必要だと思います。
この問題への入力は素晴らしいでしょう!
編集
これはTordekによって提案されています。しかし、彼のコードは52、78などの数で失敗します。そのための回避策を追加しました。これが最終的な動作コードです。
static string GetColumnName(int index)
{
const int alphabetsCount = 26;
if (index > alphabetsCount)
{
int mod = index % alphabetsCount;
int columnIndex = index / alphabetsCount;
// if mod is 0 (clearly divisible) we reached end of one combination. Something like AZ
if (mod == 0)
{
// reducing column index as index / alphabetsCount will give the next value and we will miss one column.
columnIndex -= 1;
// passing 0 to the function will return character '@' which is invalid
// mod should be the alphabets count. So it takes the last char in the alphabet.
mod = alphabetsCount;
}
return GetColumnName(columnIndex) + GetColumnName(mod);
}
else
{
int code = (index - 1) + (int)'A';
return char.ConvertFromUtf32(code);
}
}