в C #, как я могу создать массив от A до ZZ, который похож на способ, которым Excel порядок столбцов - PullRequest
7 голосов
/ 22 марта 2011

Я ищу код, который может генерировать массив, в котором первый элемент имеет значение A , затем B , затем C .,.after Z затем перейдет к AA , затем AB , затем AC .,,вплоть до ZZ .

каков наилучший способ сделать это в C #?

Ответы [ 8 ]

21 голосов
/ 22 марта 2011

Один из способов:

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

Edit:
на самом деле вы можете создать «бесконечную» последовательность (ограниченную максимальным значением 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);
}

Это выглядит так: A, B, ..., Z, AA, AB, ..., ZZ, AAA, AAB, ... и т. Д .:

foreach (var s in generate().Take(200)) Console.WriteLine(s);
3 голосов
/ 22 марта 2011

Отличный ответ Влада.

Вот еще один вариант:

 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;
     }
   }
 }
1 голос
/ 22 марта 2011

Вот один из способов. :)

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();
1 голос
/ 22 марта 2011
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);
    }
}
1 голос
/ 22 марта 2011
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() )
      )
   )
);
1 голос
/ 22 марта 2011

Нашел это в ТАК, хотя и в PHP.Это поможет? Алгоритм получения Excel-подобного имени столбца числа

1 голос
/ 22 марта 2011

Вы можете сгенерировать числа, используя Enumerable.Range, и привести их к char, чтобы сгенерировать A-Z. Следующий шаг - объединить их.

0 голосов
/ 22 марта 2011

Взгляните на таблицу ASCII и запишите значения символов.Вы должны иметь возможность разработать цикл для увеличения символа от А до Я столько раз, сколько вам нужно для репликации символов.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...