2014-06-09 43 views
-2

輸出字符串我期待這種格式解析字符串來產生特定格式

00000A 
00000B 
00000B 

,並以此類推,直到

00000Z 

然後

00001A 
00001B 
00001C 
... 
00001Z 
... 
00010A 

生成一個序列號直到

99999Z 

我知道我可以用這個方法產生最大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 
    } 
    } 
} 
+0

您可以有一個解析器和串組合,或者你可以維持目前的數量(在這種情況下,你只需要ToString方法)。無論哪種方式,我會分開數和字符串之間的轉換,做別的 –

+0

如果一切正常,你只是想使其更快,然後使用一個分析器,以確定哪一塊是最慢的和工作。否則,你只是猜測。 –

回答

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

您可以通過將數字轉換爲Base36來實現此目的。

看看這個例子:

private const string CharList = "abcdefghijklmnopqrstuvwxyz"; 

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

這將產生這樣:

000000,000001,000002 ,000003,000004,000005,000006,000007,000008,000009,00000A,00000B,00000C,00000D,00000E,00000F ,00000G,00000H,00000I,00000J,00000K,00000L,00000M,00000N,00000O,00000P,00000Q,00000R,00000S,00000T,00000U,00000V,00000W,00000X,00000Y,00000Z,000010,000011,000012,000013, ,000015,000016,000017,000018,000019,00001A,00001B,00001C,00001D,00001E,00001F,00001G,00001H,00001I,00001J,00001K,00001L,00001M,00001N,00001O,00001P,00001Q,00001R,00001S,00001T ,00001U,00001V,00001W,00001X,00001Y,00001Z,000020,000021,000022,000023,000024,000025,000026,000027,000028,000029,00002A,00002B,00002C,00002D,00002E,00002F,00002G,00002H,00002I ,00002J,00002K,00002L,00002M,00002N,00002O,00002P,00002Q,00002R,00002S,00002T ...

和對這種做法的積極的事情是,你可以通過這個轉換回數字:

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

我正在做一些非常類似於按位與的操作,但是modulo的效果要好得多! +1 –

+1

噢,你可以使用的一個改進是在'36'中代替硬編碼,你可以使用'CharList.Length',這樣你就可以很容易地將算法轉換爲基數32,或者基數爲 –

+0

@joe_coolish:nice想法,+1 – HABJAN