Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字母数字计数器_C# - Fatal编程技术网

C# 字母数字计数器

C# 字母数字计数器,c#,C#,我试图在C#中创建一个字母数字计数器,它通过以下方式创建数字: 0001 0002 0003 ... 9999 A000 A001 ... A999 B000 ... 0001 0002 0003 ... 9999 A000 A001 ... A999 B000 ... 最后一个号码是ZZZZ。首先是0-9,然后是A-Z 更新:在你发表评论后,我认为你的问题有误。您可能只需要一个简单的36进制计数器。这里有一种方法可以实现它: string base36Characters = "0123456

我试图在C#中创建一个字母数字计数器,它通过以下方式创建数字:

0001 0002 0003 ... 9999 A000 A001 ... A999 B000 ... 0001 0002 0003 ... 9999 A000 A001 ... A999 B000 ... 最后一个号码是ZZZZ。首先是0-9,然后是A-Z


更新:在你发表评论后,我认为你的问题有误。您可能只需要一个简单的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);
}
string base36Characters=“0123456789abcdefghijklmnopqrstuvxyz”;
字符串toBase36(整数x,整数位数)
{
字符[]结果=新字符[位数];
对于(整数i=数字-1;i>=0;--i)
{
结果[i]=base36个字符[x%36];
x/=36;
}
返回新字符串(结果);
}
IEnumerable base36Counter()
{
对于(int n=0;n<36*36*36*36;++n)
{
收益率36(n,4);
}
}
无效运行()
{
foreach(base36Counter()中的字符串s)
控制台。写入线(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");
        }
    }
}
IEnumerable magicCounter()
{
// 0000, 0001, ..., 9999
对于(int i=0;i<10000;++i)
{
收益回报率i.ToString(“0000”);
}
//A000,A001,…,Z999

对于(char c='A';c编辑:更新以回答澄清的问题

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

0000,0001…9999,A000…A999,B000…Z999,ZA00…ZA99,ZB00…ZZ99,ZZ0…ZZZ9,ZZZZ…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);
}
public const int MAX_VALUE=38885;
公共静态IEnumerable CustomCounter()
{
对于(int i=0;i最大值)
抛出新异常(“大于最大值”);
返回String.Format(“{0}{1}{2}{3}”,
FormatDigit(CalculateDigit(1000,参考i)),
FormatDigit(CalculateDigit(100,参考i)),
FormatDigit(CalculateDigit(10,参考i)),
(i);;
}
私有静态int calculatedGit(int m,ref int i)
{
var r=i/m;
i=i%m;
如果(r>35)
{
i+=(r-35)*m;
r=35;
}
返回r;
}
专用静态字符格式数字(int d)
{
返回(字符)(d<10?'0'+d:'A'+d-10);
}

不应该
9999
只是变成
999A
?因为这不是真正的十六进制,你必须用你的自定义逻辑编写你自己的方法。Z999之后会发生什么?或者它有那么高吗?你的数字方案似乎没有意义。它是
0,1,2,3,…,9,A,B,C,…,X,Y,Z
?什么不会最大值为?F999?Z999?
i.ToString(“0000”)
“000”
也可用于填充。@user54064:如果最后一个“数字”应为“ZZZZ”,则我认为您的问题中有错误。