在c#中,如何构建从A到ZZ的数组,这类似于excel对列进行排序的方式

在c#中,如何构建从A到ZZ的数组,这类似于excel对列进行排序的方式,c#,algorithm,C#,Algorithm,我正在寻找可以生成数组的代码,其中第一项是A,然后是B,然后是C。在Z之后,它将转到AA,然后AB然后AC。一直到ZZ 在C#中执行此操作的最佳方法是什么?请查看并记下字符的值。您应该能够计算出一个循环,将字符从a增加到Z,次数与复制字符的次数相同。:) 您可以使用Enumerable.Range生成数字,并将其强制转换为char以生成A-Z。下一步是将它们组合起来。其中一种方法是: IEnumerable<string> generate() { for (char c =

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


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

请查看并记下字符的值。您应该能够计算出一个循环,将字符从a增加到Z,次数与复制字符的次数相同。:)

您可以使用
Enumerable.Range
生成数字,并将其强制转换为
char
以生成A-Z。下一步是将它们组合起来。

其中一种方法是:

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 });
}
这个是这样的:A,B,…,Z,AA,AB,…,ZZ,AAA,AAB。。。等等:

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

在PHP中发现了这一点。这有帮助吗

类程序
{
公共静态字符串IntegerToExcelColumn(int col)
{
//我在这里加了一个256的上限,因为Excel 2003
//仅允许256列。如果正在使用,请更改它
//Excel 2007或2010。
Assert(col>=1&&col=1&&col 26&&col这里有一个方法:

string[]值=
可枚举范围(0,27*26)
.选择(
n=>新字符串(
新[]{(char)('@'+n/26),(char)('A'+n%26)},
n<26?1:0,n<26?1:2
)
)
.ToArray();
弗拉德的伟大回答

这是另一个变化:

 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;
     }
   }
 }
静态IEnumerable生成(){

对于(char c='A';c你也可以试试这个.A到ZZ

public class Program
{
    public static void Main()
    {
        int c=1;
        string cc=AtoZZ(c);
        for(int i=1;i<=702;i++){
        cc=AtoZZ(i);
        Console.WriteLine(cc);
        }
    }

    static string AtoZZ(int chr)
    {
        char c1;
        char c2;
        string alp = "";
        if(chr<=26)
        {
            c1 = (char)(chr + 64);
            alp = c1 + "";
        }        
        else
        {
            int cl1 = chr / 26;
            int cl2 = chr % 26;
            if(cl2==0){
                cl1--;
                cl2=26;
            }
            c1 = (char)(cl1 + 64);
            c2 = (char)(cl2 + 64);
            alp = c1 + "" + c2;
        }
        return alp;
     }
}
公共类程序
{
公共静态void Main()
{
int c=1;
字符串cc=AtoZZ(c);

对于(int i=1;i,为了补充Vlad的答案,这里是ToBase26(int)的反向操作:


这是如此简单和优雅以至于令人害怕:)我会返回
newstring(new[]{c,d})
以秒为单位case@Snowbear:是的,你的方式更优雅,我会改变它。这不是Base 26,因为
AA
A
不同。另请参见其中几个答案也给出了一个反向运算。@Svante:是的,但它非常接近。我同意,这个名称有点误导。(反向运算也很简单。)Linq应该用于使代码可读,而不是使代码LinqishI认为它作为他所要求的函数表达式是完美的。Vlad的外观更好,没错,但只是因为编译器隐藏了它为实现这一点而创建的所有粗糙部分。哇,很好的无限递归用法!我希望我发明了它。它甚至可以很简单r如果将第一个循环替换为just
yield return”“;
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);
    }
}
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();
 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;
     }
   }
 }
 static IEnumerable<string> generate() {
   yield return "";

   foreach (string s in generate()) {
     for (char c = 'A'; c <= 'Z'; c++) {
       yield return s + c;
     }
   }
 }
public class Program
{
    public static void Main()
    {
        int c=1;
        string cc=AtoZZ(c);
        for(int i=1;i<=702;i++){
        cc=AtoZZ(i);
        Console.WriteLine(cc);
        }
    }

    static string AtoZZ(int chr)
    {
        char c1;
        char c2;
        string alp = "";
        if(chr<=26)
        {
            c1 = (char)(chr + 64);
            alp = c1 + "";
        }        
        else
        {
            int cl1 = chr / 26;
            int cl2 = chr % 26;
            if(cl2==0){
                cl1--;
                cl2=26;
            }
            c1 = (char)(cl1 + 64);
            c2 = (char)(cl2 + 64);
            alp = c1 + "" + c2;
        }
        return alp;
     }
}
static long ToBase10(string str)
{
   if (string.IsNullOrWhiteSpace(str)) return 0;
   var value = str[0] - 'A' + 1;

   return (long) (value * Math.Pow(26, str.Length - 1) + 
          ToBase10(str.Substring(1, str.Length - 1)));
}