【问题标题】:How to auto-increment number and letter to generate a string sequence wise in c#如何在 C# 中自动递增数字和字母以生成字符串序列
【发布时间】:2017-09-26 05:17:59
【问题描述】:

我必须创建一个包含类似-AAA0009的字符串的字符串,一旦达到AAA0009,它将生成AA0010到AAA0019等等......直到AAA9999,当它达到AAA9999时,它会给出AAB0000到 AAB9999 以此类推,直到 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;
        }
    }

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

【问题讨论】:

  • 你能发布一些你尝试的代码吗?
  • Stack Overflow不是免费的代码编写服务。您应该尝试自己编写代码。在doing more research 之后,如果您有问题,您可以发布您尝试过的内容,并清楚地解释什么不起作用,并提供一个minimal reproducible example 。我建议阅读How to Ask 一个好问题和the perfect question。另外,请务必使用tour。如果您确实尝试过某些东西,请发布您的代码。我们如何在没有任何代码的情况下为您提供帮助?
  • 另外,Google 是你的朋友。例如,请参阅this。它是 Java,但您可以轻松转换它。我用谷歌找到的。有时间试试。
  • @raghav 这仅适用于简单的应用程序吗?您确定不想使用数据库跟踪您的运行票价值吗?
  • @Ephraim ya 我想跟踪,也想保留最后一个序列,就好像有人取消票一样,序列也会增加,这是一个相当大的问题,我正在努力。跨度>

标签: c#


【解决方案1】:

虽然已经有一个公认的答案,但我想分享这个。

附:我并不认为这是最好的方法,但在我之前的工作中,我们使用 Azure 表存储做了类似的事情,它是一个无 sql 数据库 (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();
    }

输出:

【讨论】:

    【解决方案2】:

    查看您提供的代码,您似乎在用一个数字来支持它,只是想将其转换为对用户更友好的文本表示形式。

    你可以试试这样的:

    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 个字符,则会在开头添加更多的字母。

    【讨论】:

      【解决方案3】:

      这里有一个例子说明你可以如何去实现它

      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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-15
        • 1970-01-01
        • 2011-07-21
        • 2017-04-30
        • 2017-01-17
        • 2014-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多