C# - 创建电子表格列名列表

时间:2016-03-10 22:54:41

标签: c#

我有一些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”,......它不再循环通过字母表。我究竟做错了什么?我一直盯着它看起来对我来说是正确的。任何帮助表示赞赏。

1 个答案:

答案 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中转换,有一些怪癖:

  • 数字替换为字母
  • 没有&#34; 0&#34;在这个表示中,所以我们跳过每个包含基数为26的0的数字。也就是说,每个数字都是26。

然后将实现包装在枚举器中以便于重用。

转换为基数26的算法取自另一个问题:https://stackoverflow.com/a/923814/869621