Самая быстрая функция для генерации букв столбцов Excel в C # - PullRequest
34 голосов
/ 08 мая 2009

Какая самая быстрая функция c #, которая принимает и int и возвращает строку, содержащую букву или буквы для использования в функции Excel? Например, 1 возвращает «A», 26 возвращает «Z», 27 возвращает «AA» и т. Д.

Это называется десятки тысяч раз и занимает 25% времени, необходимого для создания большой таблицы со многими формулами.

public string Letter(int intCol) {

    int intFirstLetter = ((intCol) / 676) + 64;
    int intSecondLetter = ((intCol % 676) / 26) + 64;
    int intThirdLetter = (intCol % 26) + 65;

    char FirstLetter = (intFirstLetter > 64) ? (char)intFirstLetter : ' ';
    char SecondLetter = (intSecondLetter > 64) ? (char)intSecondLetter : ' ';
    char ThirdLetter = (char)intThirdLetter;

    return string.Concat(FirstLetter, SecondLetter, ThirdLetter).Trim();
}

Ответы [ 21 ]

0 голосов
/ 03 июля 2009

Кэширование действительно сокращает время выполнения 10 000 000 случайных вызовов до 1/3 его значения:

    static Dictionary<int, string> LetterDict = new Dictionary<int, string>(676);
    public static string LetterWithCaching(int index)
    {
        int intCol = index - 1;
        if (LetterDict.ContainsKey(intCol)) return LetterDict[intCol];
        int intFirstLetter = ((intCol) / 676) + 64;
        int intSecondLetter = ((intCol % 676) / 26) + 64;
        int intThirdLetter = (intCol % 26) + 65;
        char FirstLetter = (intFirstLetter > 64) ? (char)intFirstLetter : ' ';
        char SecondLetter = (intSecondLetter > 64) ? (char)intSecondLetter : ' ';
        char ThirdLetter = (char)intThirdLetter;
        String s = string.Concat(FirstLetter, SecondLetter, ThirdLetter).Trim();
        LetterDict.Add(intCol, s);
        return s;
    }

Я думаю, что кэширование в худшем случае (попадание в каждое значение) не может занимать более 250 КБ (17576 возможных значений * (sizeof (int) = 4 + sizeof (char) * 3 + издержки на строку = 2)

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