C# 解析字符串以生成特定格式的输出字符串

C# 解析字符串以生成特定格式的输出字符串,c#,string,C#,String,我希望以这种格式生成一个序列号 00000A 00000B 00000B 等等,直到 00000Z 然后 00001A 00001B 00001C ... 00001Z ... 00010A 直到 我知道使用这种方法最多可以生成260万行,但我想这已经足够了 所以,如果我有一个字符串,比如26522C,现在我想要下一个数字是26522D 或者如果我有34287Z,我想要34288A 我可以写关于它的算法,但是会有很多字符对输入字符串的解析 我想知道有没有更简单的方法 String Get

我希望以这种格式生成一个序列号

00000A
00000B
00000B
等等,直到

00000Z
然后

00001A
00001B
00001C
...
00001Z
...
00010A 
直到

我知道使用这种方法最多可以生成260万行,但我想这已经足够了

所以,如果我有一个字符串,比如26522C,现在我想要下一个数字是26522D 或者如果我有34287Z,我想要34288A

我可以写关于它的算法,但是会有很多字符对输入字符串的解析

我想知道有没有更简单的方法

String GetNextNumberInSequence(String inputString)
{
   if (inputString.Length == 6)
   {  
     var charArray = inputString.ToCharArray();
     char[] inputChars = { charArray[0], charArray[1], charArray[2],charArray[3],charArray[4],charArray[5] };
     if(Char.IsDigit(charArray[5]))
     {
       //Parse first 5 characters
     }
   }
}

您可以通过将数字转换为来实现这一点

看看这个示例:

private const string CharList = "0123456789abcdefghijklmnopqrstuvwxyz";

public static String Base36Encode(long input, char paddingChar, int totalWidth)
{
    char[] clistarr = CharList.ToCharArray();
    var result = new Stack<char>();

    while (input != 0)
    {
        result.Push(clistarr[input % 36]);
        input /= 36;
    }

    return new string(result.ToArray()).PadLeft(totalWidth, paddingChar).ToUpper();
}

您可以使用解析器和to字符串组合,也可以维护当前的数字(在这种情况下,您只需要ToString方法)。不管是哪种方式,我都会将数字和字符串之间的转换分离开来,然后再做其他任何事情。如果可以的话,你只是想让转换速度更快,然后使用分析器来确定哪一块最慢,然后再进行处理。否则你只是在猜测。我对按位AND做了一些非常类似的事情,但模运算效果更好+1Oh,您可以使用的一个改进是在
36
中使用
CharList.Length
,而不是硬编码,这样您就可以轻松地将算法转换为base 32,或者base whevery,为什么在字符串数组中使用小写字母。您可以只使用大写字母开始并省去ToUpper()调用。特别是因为它会破坏索引…@BobVale:在我的项目中,我最初使用小写,没有填充。这是从我的项目快速复制粘贴和快速调整的答案的目的。除此之外,我同意你的看法。
private const string CharList = "0123456789abcdefghijklmnopqrstuvwxyz";

public static String Base36Encode(long input, char paddingChar, int totalWidth)
{
    char[] clistarr = CharList.ToCharArray();
    var result = new Stack<char>();

    while (input != 0)
    {
        result.Push(clistarr[input % 36]);
        input /= 36;
    }

    return new string(result.ToArray()).PadLeft(totalWidth, paddingChar).ToUpper();
}
for(int i = 0; i < 1000; i++)
{
    Debug.WriteLine(Base36Encode(i, '0', 6));
}
public static Int64 Base36Decode(string input)
{
    var reversed = input.ToLower().Reverse();

    long result = 0;
    int pos = 0;

    foreach (char c in reversed)
    {
        result += CharList.IndexOf(c) * (long)Math.Pow(36, pos);
        pos++;
    }

    return result;
}
    private static String GetNextNumberInSequence(String inputString)
    {
        var integerpart = int.Parse(inputString.Substring(0, 5));
        var characterPart = inputString[5];
        if (characterPart == 'Z')
            return string.Format("{0}{1}", (++integerpart).ToString("D5"), "A");

        var nextChar = (char)(characterPart + 1);
        return string.Format("{0}{1}", (integerpart).ToString("D5"), nextChar.ToString());
    }