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 を入力し、そこから URL として使用できる base 36 値を取得したいと考えています。

私はいくつかの試みをしましたが、それらはすべて間違っているようです。文字数を増やさなければならないときのテスト方法に行き詰まっています。つまり、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

この「Base 36 type for .NET」プロジェクトは、必要なものに正しくプラグインできるように見えます。

于 2012-08-01T17:59:06.407 に答える
1

これは私が今のところ使用することになったものです。

無限ではありませんが、MVC3モデルIDをlongに変更しました(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 に答える