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

我正在寻找可以生成数组的代码,其中第一项是A ,然后是B ,然后是C. 。 在Z之后它会转到AA ,然后是AB然后是AC 。 。 。 一直到ZZ

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

其中一种方法是:

IEnumerable 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 }); } 

编辑:
你可以用更复杂的代码生成“无限”序列(以最大long值为界):

 string toBase26(long i) { if (i == 0) return ""; i--; return toBase26(i / 26) + (char)('A' + i % 26); } IEnumerable generate() { long n = 0; while (true) yield return toBase26(++n); } 

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

 foreach (var s in generate().Take(200)) Console.WriteLine(s); 

弗拉德的伟大答案。

这是另一个变种:

  static IEnumerable 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; } } } 

如果您不介意使用空字符串启动序列,可以按如下方式编写它:

  static IEnumerable generate() { yield return ""; foreach (string s in generate()) { for (char c = 'A'; c <= 'Z'; c++) { yield return s + c; } } } 

您可以使用Enumerable.Range生成数字并将它们转换为char以生成AZ。 下一步是将它们组合起来。

在PHP中找到了这个,尽管是在PHP中。 这会有帮助吗? 获取数字的类似Excel的列名的算法

 var q = Enumerable.Range(Convert.ToInt32('A'),26).Select( x => Convert.ToChar(x) ); var result = ( q.Select( x => x.ToString() ) .Concat( q.SelectMany( x => q.Select( y => x.ToString() + y.ToString() ) ) ) ); 

这是一种方式。 🙂

 string[] values = Enumerable.Range(0, 27 * 26) .Select( n => new String( new[] { (char)('@' + n / 26), (char)('A' + n % 26) }, n < 26 ? 1 : 0, n < 26 ? 1 : 2 ) ) .ToArray(); 
 class Program { public static string IntegerToExcelColumn(int col) { // I've put a 256 upper bound here because Excel 2003 // allows only 256 columns. Change it if you're using // Excel 2007 or 2010. Debug.Assert(col >= 1 && col <= 256); if (col >= 1 && col <= 26) { return ((char)(((int)'A') + (col - 1))).ToString(); } // I've put a 256 upper bound here because Excel 2003 // allows only 256 columns. Change it if you're using // Excel 2007 or 2010. if (col > 26 && col <= 256) { int rem = col % 26; int pri = col / 26; if (rem == 0) { rem = 26; pri--; } char[] buffer = new char[2]; buffer[0] = (char)(((int)'A') + (pri - 1)); buffer[1] = (char)(((int)'A') + (rem - 1)); return new string(buffer); } return ""; } static void Main(string[] args) { string[] columns= new string[255]; for (int i = 1; i <= 255; i++) columns[i-1] = IntegerToExcelColumn(i); foreach(var col in columns) Console.WriteLine(col); } } 

查看ASCII表并记下字符的值。 您应该能够计算出一个循环,将字符从A增加到Z,并且需要复制字符的次数。 🙂