Увеличьте индекс, который использует цифры и символы (также известные как числа Base36) - PullRequest
3 голосов
/ 03 января 2011

У меня есть строковый код, который может быть длиной от двух до трех символов, и я ищу помощь в создании функции, которая будет увеличивать его.

Каждая «цифра» кода имеет значение от 0 до 9 и от А до Z.

некоторые примеры:

первый код в последовательности 000

009 - следующий код - 00A
00D - следующий код - 00E
AAZ - следующий код - AB0

последний код ZZZ.

Надеюсь, в этом есть какой-то смысл.

Ответы [ 3 ]

3 голосов
/ 03 января 2011

Поддерживайте счетчик как int и увеличивайте его. Преобразуйте int в представление вашего персонажа путем итеративного изменения и деления на 36. Сопоставьте модовый диапазон (0-35) с 0-Z.

* ** 1003 тысяча два * Пример

Обновлено с функциями, чтобы идти в любом направлении:

internal class Program
{
    const int Base = 36;

    public static void Main()
    {
        Console.WriteLine(ToInt("0AA"));
        Console.WriteLine(ToString(370));
    }

    private static string ToString(int counter)
    {
        List<char> chars = new List<char>();

        do
        {
            int c = (counter % Base);

            char ascii = (char)(c + (c < 10 ? 48 : 55));

            chars.Add(ascii);
        }
        while ((counter /= Base) != 0);

        chars.Reverse();

        string charCounter = new string(chars.ToArray()).PadLeft(3, '0');

        return charCounter;
    }

    private static int ToInt(string charCounter)
    {
        var chars = charCounter.ToCharArray();

        int counter = 0;

        for (int i = (chars.Length - 1), j = 0; i >= 0; i--, j++)
        {
            int chr = chars[i];

            int value = (chr - (chr > 57 ? 55 : 48)) * (int)Math.Pow(Base, j);

            counter += value;
        }

        return counter;
    }

Дополнительные варианты кода преобразования приведены в Самый быстрый способ преобразовать число 10 в любую базу в .NET? .

2 голосов
/ 03 января 2011

Спасибо за совет, ребята.

Это то, что я независимо придумал.

    private static String Increment(String s)
    {
        String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        char lastChar = s[s.Length - 1];
        string fragment = s.Substring(0, s.Length - 1);

        if (chars.IndexOf(lastChar) < 35)
        {
            lastChar = chars[chars.IndexOf(lastChar) + 1];

            return fragment + lastChar;
        }

        return Increment(fragment) + '0';
    }

Я не знаю, лучше это или хуже, но, похоже, работает. Если кто-то может предложить улучшения, то это здорово.

1 голос
/ 03 января 2011

Делает ли это то, что вам нужно?

public class LetterCounter
{
    private static readonly string[] _charactersByIndex = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };

    public string GetStr(int i)
    {
        if (i < _charactersByIndex.Length)
            return _charactersByIndex[i];

        int x = i / (_charactersByIndex.Length - 1) - 1;
        string a = _charactersByIndex[x];
        string b = GetStr(i - (_charactersByIndex.Length - 1));
        return a + b;
    }
}

}

...