Ищете способ иметь последовательность base36 в C # - PullRequest
0 голосов
/ 30 ноября 2011

В моем приложении я использую последовательности.Они хранятся в хранилище таблиц Azure в виде строк.Чтобы обновить последовательность, я получаю последний номер в виде строки, преобразовываю в число, добавляю к номеру и сохраняю его как текущее значение последовательности.Последовательности используются внутри как уникальные ключи, но они также видны пользователю в URL-адресах, поэтому я хотел бы, чтобы они были короткими.

Что я рассматриваю, так это идею иметь последовательность в base36.Другими словами 0-Z.Кто-нибудь знает, как я могу получить последовательность, которая хранится в виде 4-значный строки, начинающейся с «0000», а затем добавить один к нему, чтобы дать «0001» вплоть до «ZZZZ» в качестве последнего возможного значения последовательности.

Ответы [ 3 ]

2 голосов
/ 30 ноября 2011

Я понятия не имею, действительно ли это то, о чем вы просите, но чтобы получить List<string>, начиная с 0000 и заканчивая на ZZZZ, вы могли бы сделать что-то вроде:

        var baseChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
        int radix = baseChars.Length, length = 4;
        var strings = Enumerable.Range(0, (int)Math.Pow(radix,length)).Select(value =>
        {
            var buffer = new string('0',length).ToCharArray();
            int i = length;
            do
            {
                buffer[--i] = baseChars[value%radix];
                value /= radix;
            } while (value > 0);

            return new string(buffer);
        }).ToList();
2 голосов
/ 30 ноября 2011

Это должно сделать это:

public static string Inc(string s){

    System.Func<char,int> v = c => (int)((c<='9')?(c-'0'):(c-'A'+10));
    System.Func<int,char> ch = d => (char)(d+((d<10)?'0':('A'-10)));    

    s = s.ToUpper();    
    var sb = new System.Text.StringBuilder(s.Length);
    sb.Length = s.Length;

    int carry = 1;
    for(int i=s.Length-1; i>=0; i--){
        int x = v(s[i])+carry;    
        carry = x/36;
        sb[i] = ch(x%36);
    }
    if (carry>0)
        return ch(carry) + sb.ToString();
    else
        return sb.ToString();
}
1 голос
/ 30 ноября 2011

Может быть не самым оптимизированным, но очень простым и может использоваться с другим алфавитом

private static void Main(string[] args)
{
    var letters = "0123456789abcdefghijklmnop".ToArray();

    var initial = "0000";

    for (int i = 0; i < 10000; i++)
    {
        initial = Increment(initial, letters);
        Console.WriteLine(initial);
    }

    Console.ReadLine();
}

public static string Increment(string input, char[] alphabet)
{
    var sa = input.ToArray();
    var lastChar = sa[sa.Length - 1];
    if (lastChar != alphabet.Last())
    {
        var index = Array.IndexOf(alphabet, lastChar);
        sa[sa.Length - 1] = alphabet[index + 1];
        return new string(sa);
    }

    return Increment(input.Substring(0, input.Length - 1), alphabet) + alphabet[0];
}
...