2012-08-01 51 views
1

試圖建立在此線程[Alphanumeric Counter]的答案建立一個無填充無限(對於任何int)字母數字計數器。無盡的(幾乎)字母數字計數器

我想創建一個計數器,從0開始,並計算這樣的事情。

0,1,2 ... Y,Z,10,11,12 ... 1Y,1Z,20,21 ... ZY,ZZ,100,101 ... ZZZ,1000,1001 ...無窮大(溢出)...

計數器的目的是從我的數據庫INT id創建短URL。我想輸入行的id並從中獲得一個基本的值,我可以使用它作爲url。

我做了一些嘗試,但他們似乎都最終錯了。我遇到了如何測試何時應增加字符數的問題。即從Z變爲10或從ZZ變爲100.

+0

要求一個「無盡的」櫃檯,後來認識到,32位是有點短,是不努力的努力幫助。 – HABO 2012-08-01 18:55:54

+0

我道歉,這不是我的意圖。不過,由於Jon Skeet的回答,我可能會重寫我的模型和代碼,以便它真正無限。 – JensB 2012-08-01 19:17:27

回答

5

我想這是你想要什麼:

using System; 
using System.Collections.Generic; 

class Test 
{ 
    static void Main() 
    { 
     foreach (string x in EndlessBase64Sequence()) 
     { 
      Console.WriteLine(x); 
     } 
    } 

    private static char NextBase36Char(char c) 
    { 
     if ((c >= '0' && c <= '8') || 
      (c >= 'A' && c <= 'Z')) 
     { 
      return (char) (c + 1); 
     } 
     if (c == '9') 
     { 
      return 'A'; 
     } 
     throw new ArgumentException(); 
    } 

    public static IEnumerable<string> EndlessBase64Sequence() 
    { 
     char[] chars = { '0' }; 

     while (true) 
     { 
      yield return new string(chars); 

      // Move to the next one... 
      bool done = false; 
      for (int position = chars.Length - 1; position >= 0; position--) 
      { 
       if (chars[position] == 'Z') 
       { 
        chars[position] = '0'; 
       } 
       else 
       { 
        done = true; 
        chars[position] = NextBase36Char(chars[position]); 
        break; 
       } 
      } 
      // Need to expand? 
      if (!done) 
      { 
       chars = new char[chars.Length + 1]; 
       chars[0] = '1'; 
       for (int i = 1; i < chars.Length; i++) 
       { 
        chars[i] = '0'; 
       } 
      } 
     } 
    } 
} 
+0

謝謝。我認爲這可能比我需要的更多。 該計數器的目的是將我的數據庫INT ID轉換爲字母數字網址。我試圖澄清一下我的問題來表明這一點。但現在你已經向我顯示了這一點,我可能不得不刪除我的int列,並將其用作我的ID列,這樣我才能在我的數據庫中真正擁有無盡的行=) – JensB 2012-08-01 18:40:07

4

This「基於.NET的.NET類型」項目看起來好像會插入你所需要的東西。

+0

這並不是無止境的。它有一個最大值'long.MaxValue'。我們可以做得更好:)無可否認,這實際上是*無限的,因爲'long.MaxValue'非常糟糕,但是... – 2012-08-01 18:07:53

+0

然後再次。計算中有無限的東西嗎? – Mob 2012-08-01 18:19:03

+0

在實踐中,它不是無限的,但「這個數字最多可以長達64位」和「這個數字可以與存儲器的內存一樣大」。 – 2012-08-01 18:23:57

1

這是我最後使用了現在。

它不是無限的,但我改變了我的MVC3模型ID的長(MVC3不支持ULONG)其中有一個9223372036854775807最大值我懷疑我的系統將有更多的行比..

private const string base36Characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    public static string toBase36(long x) 
    { 
     String alpha =""; 
     while(x>0){ 
      alpha = base36Characters[(int) (x % 36)] + alpha; 
      x /= 36; 
     } 
     return alpha.ToLower(); 
    } 

測試它的數字高達zzzzz,然後我的筆記本電腦停止工作...

+0

這並不是無止境的,它變成了'int.MAX_VALUE' – 2012-08-01 18:27:02

+0

非常真實。但是,在數據庫中,我也會遇到一個我的ids問題。我可能在我的問題上有點不清楚,但我的目的是「我想輸入該行的id並從中獲得基礎值,我可以將其用作url。」所以我不需要一個真正的無盡的解決方案,但比以前的線程提供了一個更無窮的解決方案。 – JensB 2012-08-01 18:34:10

+0

將while循環的第一行更改爲'alpha = base36Characters [(int)(x%36)] + alpha;'你可以讓它通過[支持'%'和'/']的任何數據類型「( http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx)而不是一個整數,(這順便說一句,你可以通過3W5E11264SGSF 0到0。MaxValue) – 2012-08-01 18:55:02