2016-03-10 2 views
1

У меня есть код на C#. Я пытаюсь создать список имен столбцов в электронной таблице. В электронной таблице ячейки перечислены слева направо, начиная с буквы «А» и переходя к чему-то вроде «ABC». Я пытаюсь динамически генерировать имена ячеек в списке:C# - Создание списка таблиц Имена столбцов

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», ... Его еще не перебирает алфавит. Что я делаю не так? Я продолжаю смотреть на него, и это выглядит правильно для меня. Любая помощь приветствуется.

+0

Логика, как представляется, «столько раз, сколько' k' цикл выполняется, добавить текущую букву», которая могла бы объяснить его Это не совсем понятно, что вы ожидаете от выхода? AA AB AC? – stuartd

+1

Если это поможет, вы можете заменить цикл 'j' на' foreach (char letter в «ABCDEFGHIJKLMNOPQRSTUVWXYZ») ' – stuartd

ответ

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, с несколькими причуды:

  • цифры заменены буквами
  • Существует нет «0» в этом представлении, поэтому мы пропускаем все числа, которые будут содержать 0 в базе 26. То есть, все кратные 26.

Реализация затем завернута в перечислитель для более легкого повторного использования.

алгоритм для преобразования в базу 26 был взят из другого вопроса:. https://stackoverflow.com/a/923814/869621

Смежные вопросы