【问题标题】:Increment a string from numbers 0-9 to lowercase a-z to uppercase A-Z in C#在 C# 中将字符串从数字 0-9 递增到小写 a-z 到大写 A-Z
【发布时间】:2013-11-07 08:30:21
【问题描述】:

我希望能够有一个以 '000000' 开头的 6 个字符长的字符串。然后我想在我点击 9 时将它增加一个 '000001' 我想去 '00000a' 当我到达 z 我想去 '00000A' 时。当达到“Z”时,我想将第一个重置为 0 并从下一个位置“000010”开始,依此类推。 '000011','000012'...'0000a0','0000a1'...'0000A0','0000A1'

我将如何在 C# 中执行此操作?

提前谢谢你。 迈克

【问题讨论】:

  • 这听起来像是家庭作业?您是否有任何您已经尝试过的代码可以添加到您的问题中?
  • 逻辑不是很清楚,你能详细说明一下“我想在我打9的时候增加一个'000001'我想去'00000a'” ?
  • 我不是学生。我正在使用存储过程来执行此操作,但认为程序会更好,因为它在本地而不是在 sql 服务器上运行。
  • @Mike:为什么你认为client比db-server更合适?如果数字与数据库相关,则应根据当前最高数字从数据库中计算出来。
  • Tim,它本质上只是在字符串中加一个,但不是 0-9 的范围,而是 0-9 然后 a-z 然后 A-Z 的范围。

标签: c# string increment uppercase lowercase


【解决方案1】:

这使用 IntToString 支持来自问题 Quickest way to convert a base 10 number to any base in .NET? 的任意基数,但硬编码为使用您的格式(即基数 62)。

private static readonly char[] baseChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
private const long targetBase = 62;
private const long maxNum = 62L*62*62*62*62*62 - 1;
public static string NumberToString(long value)
{
    if (value > maxNum)
        throw new ArgumentException();
    char[] result = "000000".ToCharArray();

    int i = result.Length - 1;
    do
    {
        result[i--] = baseChars[value % targetBase];
        value /= targetBase;
    } 
    while (value > 0);

    return new string(result);
}

【讨论】:

  • 谢谢蒂姆,这让我开始了。
【解决方案2】:

基于字符串的方法,类似于 Tim S 的回答:

private static string Increment(string input)
    {
        var myChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
        var array = input.ToCharArray();

        for (int i = array.Count()-1; i >= 0; i--)
        {
            int newValue = (Array.IndexOf(myChars, array[i]) + 1) % 62;
            array[i] = myChars[newValue];
            if (newValue != 0)
                break;
        }
        return new string(array);
    }

【讨论】:

    【解决方案3】:

    这是另一种方法...它允许您传入“起始修订版”(示例中为“000000”)。很久以前,我最初是在VB.Net中写的,为了回答一个要求非常具体的问题......所以下面可能不是最有效的做事方式。

    public partial class Form1 : Form
    {
    
        private Revision rev;
    
        public Form1()
        {
            InitializeComponent();
            Reset();
        }
    
        private void Reset()
        {
            rev = new Revision("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", "000000");
            label1.Text = rev.CurrentRevision;
        }
    
        private void btnReset_Click(object sender, EventArgs e)
        {
            Reset();
        }
    
        private void btnNext_Click(object sender, EventArgs e)
        {
            rev.NextRevision();
            if (rev.CurrentRevision.Length == 7)
            {
                MessageBox.Show("Sequence Complete");
                Reset();
            }
            else
            {
                label1.Text = rev.CurrentRevision;
            }
        }
    
    }
    
    public class Revision
    {
    
        private string chars;
        private char[] values;
    
        private System.Text.StringBuilder curRevision;
    
        public Revision()
        {
            this.DefaultRevision();
        }
    
        public Revision(string validChars)
        {
            if (validChars.Length > 0)
            {
                chars = validChars;
                values = validChars.ToCharArray();
                curRevision = new System.Text.StringBuilder(values[0]);
            }
            else
            {
                this.DefaultRevision();
            }
        }
    
        public Revision(string validChars, string startingRevision)
            : this(validChars)
        {
            curRevision = new System.Text.StringBuilder(startingRevision);
            int i = 0;
            for (i = 0; i <= curRevision.Length - 1; i++)
            {
                if (Array.IndexOf(values, curRevision[i]) == -1)
                {
                    curRevision = new System.Text.StringBuilder(values[0]);
                    break;
                }
            }
        }
    
        private void DefaultRevision()
        {
            chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            values = chars.ToCharArray();
            curRevision = new System.Text.StringBuilder(values[0]);
        }
    
        public string ValidChars
        {
            get { return chars; }
        }
    
        public string CurrentRevision
        {
            get { return curRevision.ToString(); }
        }
    
        public string NextRevision(int numRevisions = 1)
        {
            bool forward = (numRevisions > 0);
            numRevisions = Math.Abs(numRevisions);
            int i = 0;
            for (i = 1; i <= numRevisions; i++)
            {
                if (forward)
                {
                    this.Increment();
                }
                else
                {
                    this.Decrement();
                }
            }
            return this.CurrentRevision;
        }
    
        private void Increment()
        {
            char curChar = curRevision[curRevision.Length - 1];
            int index = Array.IndexOf(values, curChar);
            if (index < (chars.Length - 1))
            {
                index = index + 1;
                curRevision[curRevision.Length - 1] = values[index];
            }
            else
            {
                curRevision[curRevision.Length - 1] = values[0];
                int i = 0;
                int startPosition = curRevision.Length - 2;
                for (i = startPosition; i >= 0; i += -1)
                {
                    curChar = curRevision[i];
                    index = Array.IndexOf(values, curChar);
                    if (index < (values.Length - 1))
                    {
                        index = index + 1;
                        curRevision[i] = values[index];
                        return;
                    }
                    else
                    {
                        curRevision[i] = values[0];
                    }
                }
                curRevision.Insert(0, values[0]);
            }
        }
    
        private void Decrement()
        {
            char curChar = curRevision[curRevision.Length - 1];
            int index = Array.IndexOf(values, curChar);
            if (index > 0)
            {
                index = index - 1;
                curRevision[curRevision.Length - 1] = values[index];
            }
            else
            {
                curRevision[curRevision.Length - 1] = values[values.Length - 1];
                int i = 0;
                int startPosition = curRevision.Length - 2;
                for (i = startPosition; i >= 0; i += -1)
                {
                    curChar = curRevision[i];
                    index = Array.IndexOf(values, curChar);
                    if (index > 0)
                    {
                        index = index - 1;
                        curRevision[i] = values[index];
                        return;
                    }
                    else
                    {
                        curRevision[i] = values[values.Length - 1];
                    }
                }
                curRevision.Remove(0, 1);
                if (curRevision.Length == 0)
                {
                    curRevision.Insert(0, values[0]);
                }
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多