字母数字计数器

3

我正在尝试使用C#创建一个字母数字计数器,以以下方式创建数字:

0001
0002
0003
...
9999
A000
A001
...
A999
B000
...

最后一个数字将是ZZZZ。因此,首先是0-9,然后是A-Z。

我不知道如何实现这个功能。


4
“9999”不应该变成“999A”吗? - jjnguy
因为这不是真正的十六进制,所以你需要编写自己的方法并使用自定义逻辑。 - rlb.usa
Z999之后会发生什么?或者说这个高度有关系吗? - devios1
2
你的数字方案似乎没有意义。它是这样的吗 0,1,2,3,..,9,A,B,C,...,X,Y,Z - jjnguy
最大值会是什么?F999?Z999? - Paul Sasik
显示剩余6条评论
2个回答

8
更新:根据您的评论,我认为您的问题中有一个错误。您可能只是想要一个简单的基数36计数器。以下是一种实现方式:
string base36Characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

string toBase36(int x, int digits)
{
    char[] result = new char[digits];
    for (int i = digits - 1; i >= 0; --i)
    {
        result[i] = base36Characters[x % 36];
        x /= 36;
    }
    return new string(result);
}

IEnumerable<string> base36Counter()
{
    for (int n = 0; n < 36 * 36 * 36 * 36; ++n)
    {
        yield return toBase36(n, 4);
    }
}

void Run()
{
    foreach (string s in base36Counter())
        Console.WriteLine(s);
}

原始回答:我可能会使用yield来实现:

IEnumerable<string> magicCounter()
{
    // 0000, 0001, ..., 9999
    for (int i = 0; i < 10000; ++i)
    {
        yield return i.ToString("0000");
    }

    // A000, A001, ..., Z999
    for (char c = 'A'; c <= 'Z'; ++c)
    {
        for (int i = 0; i < 1000; ++i)
        {
            yield return c + i.ToString("000");
        }
    }
}

"i.ToString( "0000" )" 或者使用 "000" 进行填充也可以。 - devios1
如果最后一个“number”应该是“ZZZZ”,那么我认为你的问题有错误。 - Mark Byers

2

编辑:已更新以回答澄清的问题。

以下代码将生成您描述的计数器:

0000、0001……9999、A000……A999、B000……Z999、ZA00……ZA99、ZB00……ZZ99、ZZA0……ZZZ9、ZZZA……ZZZZ

public const int MAX_VALUE = 38885;

public static IEnumerable<string> CustomCounter()
{
    for (int i = 0; i <= MAX_VALUE; ++i)
        yield return Format(i);
}

public static string Format(int i)
{
    if (i < 0)
        throw new Exception("Negative values not supported.");
    if (i > MAX_VALUE)
        throw new Exception("Greater than MAX_VALUE");

    return String.Format("{0}{1}{2}{3}",
                         FormatDigit(CalculateDigit(1000, ref i)),
                         FormatDigit(CalculateDigit(100, ref i)),
                         FormatDigit(CalculateDigit(10, ref i)),
                         FormatDigit(i));
}

private static int CalculateDigit(int m, ref int i)
{
    var r = i / m;
    i = i % m;
    if (r > 35)
    {
        i += (r - 35) * m;
        r = 35;
    }
    return r;
}

private static char FormatDigit(int d)
{
    return (char)(d < 10 ? '0' + d : 'A' + d - 10);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接