寻找一种在c#中拥有base36序列的方法

本文关键字:base36 拥有 方法 一种 寻找 | 更新日期: 2023-09-27 18:16:07

在我的应用程序中我使用序列。它们以字符串的形式存储在Azure表存储中。为了更新序列,我将最新的数字作为字符串,转换为数字,添加数字并将其存储为当前序列值。这些序列在内部用作唯一键,但它们也在url中对用户可见,所以我想保持它们简短。

我正在考虑的是在base36中有一个序列的想法。换句话说就是0-Z。有没有人知道我如何获得一个以"0000"开头的4位数字符串存储的序列,然后向其添加一个,以使"0001"一直到"ZZZZ"作为序列的最后一个可能值。

寻找一种在c#中拥有base36序列的方法

应该这样做:

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

我不知道这是否是,事实上,你在问什么,但是要得到一个从0000开始,以ZZZZ结束的List<string>,你可以这样做:

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

可能不是最优化的,但非常简单,可以用于不同的字母

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