C# 字母数字计数器
我试图在C#中创建一个字母数字计数器,它通过以下方式创建数字: 0001 0002 0003 ... 9999 A000 A001 ... A999 B000 ... 0001 0002 0003 ... 9999 A000 A001 ... A999 B000 ... 最后一个号码是ZZZZ。首先是0-9,然后是A-ZC# 字母数字计数器,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
更新:在你发表评论后,我认为你的问题有误。您可能只需要一个简单的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”,则我认为您的问题中有错误。