我必须创建一个字符串,其中包含一个字符串,如AAA0009,一旦达到AAA0009,它将生成AA0010到AAA0019等等......直到AAA9999,当它达到AAA9999时,它将给出AAB0000到AZ9999等,直到ZZZ9999。
我想使用静态类和静态变量,以便它可以在每次点击时自动增加。
我已尝试了一些但甚至没有关闭,所以请帮助我谢谢。
感谢我的指导,我正在尝试,但是无论如何你已经想要在那里放阴性而不知道这件事:
代码:
public class GenerateTicketNumber
{
private static int num1 = 0;
public static string ToBase36()
{
const string base36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var sb = new StringBuilder(9);
do
{
sb.Insert(0, base36[(byte)(num1 % 36)]);
num1 /= 36;
} while (num1 != 0);
var paddedString = "#T" + sb.ToString().PadLeft(8, '0');
num1 = num1 + 1;
return paddedString;
}
}
以上是代码。这将产生一个序列,但不是我想要的方式,无论如何都会使用它并感谢您的帮助。
答案 0 :(得分:1)
这是一个如何实施它的例子
void Main()
{
string template = @"AAAA00";
var templateChars = template.ToCharArray();
for (int i = 0; i < 100000; i++)
{
templateChars = IncrementCharArray(templateChars);
Console.WriteLine(string.Join("",templateChars ));
}
}
public static char Increment(char val)
{
if(val == '9') return 'A';
if(val == 'Z') return '0';
return ++val;
}
public static char[] IncrementCharArray(char[] val)
{
if (val.All(chr => chr == 'Z'))
{
var newArray = new char[val.Length + 1];
for (int i = 0; i < newArray.Length; i++)
{
newArray[i] = '0';
}
return newArray;
}
int length = val.Length;
while (length > -1)
{
char lastVal = val[--length];
val[length] = Increment(lastVal);
if ( val[length] != '0') break;
}
return val;
}
答案 1 :(得分:1)
查看您提供的代码,似乎您使用数字支持此代码,并且只想将其转换为更加用户友好的文本表示。
您可以尝试这样的事情:
private static string ValueToId(int value)
{
var parts = new List<string>();
int numberPart = value % 10000;
parts.Add(numberPart.ToString("0000"));
value /= 10000;
for (int i = 0; i < 3 || value > 0; ++i)
{
parts.Add(((char)(65 + (value % 26))).ToString());
value /= 26;
}
return string.Join(string.Empty, parts.AsEnumerable().Reverse().ToArray());
}
它将采用前4个字符并按原样使用它们,然后对于值的其余部分,如果将其转换为字符A-Z。
因此9999变为AAA9999,10000变为AAB0000,270000变为ABB0000。
如果数字足够大,超过3个字符,则会在开头添加更多字母。
答案 2 :(得分:1)
虽然已有一个已接受的答案,但我想分享一下。
P.S。我并不认为这是最好的方法,但在我之前的工作中,我们使用Azure表存储创建了类似的东西,这是一个无数据库(FYI),它可以工作。
1。)创建一个表来存储您正在运行的票号。
public class TicketNumber
{
public string Type { get; set; } // Maybe you want to have different types of ticket?
public string AlphaPrefix { get; set; }
public string NumericPrefix { get; set; }
public TicketNumber()
{
this.AlphaPrefix = "AAA";
this.NumericPrefix = "0001";
}
public void Increment()
{
int num = int.Parse(this.NumericPrefix);
if (num + 1 >= 9999)
{
num = 1;
int i = 2; // We are assuming that there are only 3 characters
bool isMax = this.AlphaPrefix == "ZZZ";
if (isMax)
{
this.AlphaPrefix = "AAA"; // reset
}
else
{
while (this.AlphaPrefix[i] == 'Z')
{
i--;
}
char iChar = this.AlphaPrefix[i];
StringBuilder sb = new StringBuilder(this.AlphaPrefix);
sb[i] = (char)(iChar + 1);
this.AlphaPrefix = sb.ToString();
}
}
else
{
num++;
}
this.NumericPrefix = num.ToString().PadLeft(4, '0');
}
public override string ToString()
{
return this.AlphaPrefix + this.NumericPrefix;
}
}
2.确保执行行级锁定并在失败时发出错误。
这是一个oracle语法:
SELECT * FROM TICKETNUMBER WHERE TYPE = 'TYPE' FOR UPDATE NOWAIT;
如果该行当前被另一个会话锁定,则此查询会锁定该行并返回错误。
我们需要这样做以确保即使您有数百万用户生成票号,也不会弄乱序列。
只需确保在执行COMMIT
之前保存新的票号。
我忘记了这个的MSSQL版本,但我记得使用WITH (ROWLOCK)
或其他东西。只是谷歌吧。
3。)工作示例:
static void Main()
{
TicketNumber ticketNumber = new TicketNumber();
ticketNumber.AlphaPrefix = "ZZZ";
ticketNumber.NumericPrefix = "9999";
for (int i = 0; i < 10; i++)
{
Console.WriteLine(ticketNumber);
ticketNumber.Increment();
}
Console.Read();
}
输出: