1

尝试在此线程 [ Alphanumeric Counter ] 中的答案的基础上构建一个没有填充的无限(对于任何 int)字母数字计数器。

我想创建一个从 0 开始并计算类似这样的计数器。

0,1,2...Y,Z,10,11,12...1Y,1Z,20,21...ZY,ZZ,100,101...ZZZ,1000,1001 .. 无穷大(溢出)。 ...

计数器的目的是从我INT的数据库 ID 创建短 URL。我想输入行的 id 并从中获取一个基数为 36 的值,我可以将其用作 url。

我做了一些尝试,但似乎都错了。当我应该增加字符数时,我陷入了如何测试的问题。即从 Z 到 10 或从 ZZ 到 100。

4

3 回答 3

5

我认为这就是你想要的:

using System;
using System.Collections.Generic;

class Test
{
    static void Main()
    {
        foreach (string x in EndlessBase64Sequence())
        {
            Console.WriteLine(x);
        }
    }

    private static char NextBase36Char(char c)
    {
        if ((c >= '0' && c <= '8') ||
            (c >= 'A' && c <= 'Z'))
        {
            return (char) (c + 1);
        }
        if (c == '9')
        {
            return 'A';
        }
        throw new ArgumentException();
    }

    public static IEnumerable<string> EndlessBase64Sequence()
    {
        char[] chars = { '0' };

        while (true)
        {
            yield return new string(chars);

            // Move to the next one...
            bool done = false;
            for (int position = chars.Length - 1; position >= 0; position--)
            {
                if (chars[position] == 'Z')
                {
                    chars[position] = '0';
                }
                else
                {
                    done = true;
                    chars[position] = NextBase36Char(chars[position]);
                    break;
                }
            }
            // Need to expand?
            if (!done)
            {
                chars = new char[chars.Length + 1];
                chars[0] = '1';
                for (int i = 1; i < chars.Length; i++)
                {
                    chars[i] = '0';
                }
            }
        }
    }
}
于 2012-08-01T18:06:41.363 回答
4

这个“用于 .NET 的 Base 36 类型”项目似乎可以直接插入您需要的内容。

于 2012-08-01T17:59:06.407 回答
1

这就是我现在最终使用的。

它不是无限的,但我将我的 MVC3 模型 ID 更改为长(MVC3 不支持 ulong),最大值为 9223372036854775807。我怀疑我的系统会有比这更多的行。

    private const string base36Characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    public static string toBase36(long x)
    {
        String alpha ="";
        while(x>0){
            alpha = base36Characters[(int) (x % 36)] + alpha;
            x /= 36;
        }
        return alpha.ToLower();
    }

测试它的数字高达 zzzzz,然后我的笔记本电脑停止工作......

于 2012-08-01T18:11:08.313 回答