在c#中,我如何构建从A到ZZ的数组,类似于excel命令列的方式

leo*_*ora 7 c# algorithm

我期待的代码,它可以产生一个阵列,其中第一项是一个,然后,然后Ç..在Z之后,它将转到AA,然后是AB然后是AC...一直到ZZ.

在C#中执行此操作的最佳方法是什么?

Vla*_*lad 21

其中一种方法是:

IEnumerable<string> generate()
{
    for (char c = 'A'; c <= 'Z'; c++)
        yield return new string(c, 1);
    for (char c = 'A'; c <= 'Z'; c++)
        for (char d = 'A'; d <= 'Z'; d++)
            yield return new string(new[] { c, d });
}
Run Code Online (Sandbox Code Playgroud)

编辑:
您实际上可以long使用更复杂的代码生成"无限"序列(以最大值为界):

string toBase26(long i)
{
    if (i == 0) return ""; i--;
    return toBase26(i / 26) + (char)('A' + i % 26);
}

IEnumerable<string> generate()
{
    long n = 0;
    while (true) yield return toBase26(++n);
}
Run Code Online (Sandbox Code Playgroud)

这个是这样的:A,B,......,Z,AA,AB,...,ZZ,AAA,AAB,......等:

foreach (var s in generate().Take(200)) Console.WriteLine(s);
Run Code Online (Sandbox Code Playgroud)

  • 很优雅的解决方案 (2认同)
  • 这是如此简单和优雅,它是可怕的:) (2认同)
  • 这不是Base 26,因为`AA`与`A`不同.另见http://stackoverflow.com/questions/763691/programming-riddle-how-might-you-translate-an-excel-column-name-to-a-number其中几个答案也给出了逆操作. (2认同)

Jan*_*Jan 6

弗拉德的好答案。

这是另一个变化:

 static IEnumerable<string> generate() {
   for (char c = 'A'; c <= 'Z'; c++) {
     yield return c.ToString();
   }

   foreach (string s in generate()) {
     for (char c = 'A'; c <= 'Z'; c++) {
       yield return s + c;
     }
   }
 }
Run Code Online (Sandbox Code Playgroud)

如果您不介意以空字符串开始序列,您可以按如下方式编写:

 static IEnumerable<string> generate() {
   yield return "";

   foreach (string s in generate()) {
     for (char c = 'A'; c <= 'Z'; c++) {
       yield return s + c;
     }
   }
 }
Run Code Online (Sandbox Code Playgroud)

  • 哇,不错的无限递归用法!我希望我发明了这个。如果只用 `yield return "";` 替换第一个循环可能会更简单。 (2认同)