我有一些C#代码。我正在尝试在电子表格中生成列名列表。在电子表格中,单元格从左到右列出,从“A”开始,到达“ABC”之类的东西。我正在尝试将单元名称动态生成到这样的列表中:
var cells = new List<string>();
for (var i=1; i<=5; i++)
{
for (var j = 0; j < 26; j++)
{
var column = "";
for (var k=0; k < i; k++)
{
char letter = Convert.ToChar(j + (int)'A');
column = column + letter;
}
cells.Add(column);
}
}
不幸的是,我的方法不起作用。一旦我越过“Z”,我立即看到“AA”,“BB”,“CC”,......它不再循环通过字母表。我究竟做错了什么?我一直盯着它看起来对我来说是正确的。任何帮助表示赞赏。
答案 0 :(得分:0)
正如@stuartd在评论中指出的那样,你的算法只是设置相同的字母i - k
次。您应该学习如何在Visual Studio中使用逐步执行,因为它有助于调试这种算法。
作为替代方案,我可以建议这个算法:
static void Main(String[] args)
{
foreach (var column in GetColumns().Take(52))
{
Console.WriteLine(column);
}
Console.ReadLine();
}
public static IEnumerable<string> GetColumns()
{
const string Alphabet = " ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (int index = 1; ; index++)
{
if (index % Alphabet.Length == 0)
{
continue;
}
var columnName = string.Empty;
int value = index;
do
{
columnName = Alphabet[value % Alphabet.Length] + columnName;
value = value / Alphabet.Length;
} while (value > 0);
yield return columnName;
}
}
主要思想是认为列名几乎是列的数字索引,但是在基数26中转换,有一些怪癖:
然后将实现包装在枚举器中以便于重用。
转换为基数26的算法取自另一个问题:https://stackoverflow.com/a/923814/869621