如何在c#

时间:2017-09-26 05:17:59

标签: c#

我必须创建一个字符串,其中包含一个字符串,如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;
        }
    }

以上是代码。这将产生一个序列,但不是我想要的方式,无论如何都会使用它并感谢您的帮助。

3 个答案:

答案 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();
    }

输出:

enter image description here