在我的应用程序中,我使用序列。这些以字符串形式存储在 Azure 表存储中。要更新序列,我将最新的数字作为字符串,转换为数字,添加到数字并将其作为当前序列值存储回来。这些序列在内部用作唯一键,但它们在用户的 URL 中也可见,所以我想保持简短。
我正在考虑的是在base36中有一个序列的想法。换句话说,0-Z。有谁知道如何获得一个以“0000”开头的 4 位字符串存储的序列,然后在其中添加一个以将“0001”一直到“ZZZZ”作为序列的最后一个可能值。
实际上,我不知道这是否是您要问的,但是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();
这应该这样做:
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();
}
可能不是最优化的,但非常简单,可以与不同的字母表一起使用
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];
}