使用C#自动生成字母数字唯一ID

时间:2010-03-16 06:53:31

标签: c# .net

总字符串长度为5个字符

我有一个场景,ID以

开头

A0001然后以A9999结束 B0001至B9999直至F0001至f9999

之后

FA001到FA999然后 FB001到FB999直到.... FFFF9

请就如何创建此格式提出任何建议。

5 个答案:

答案 0 :(得分:5)

public static IEnumerable<string> Numbers()
{
    return Enumerable.Range(0xA0000, 0xFFFF9 - 0xA0000 + 1)
        .Select(x => x.ToString("X"));
}

您还可以拥有一个id生成器类:

public class IdGenerator
{
    private const int Min = 0xA0000;
    private const int Max = 0xFFFF9;
    private int _value = Min - 1;

    public string NextId()
    {
        if (_value < Max)
        {
            _value++;
        }
        else
        {
            _value = Min;
        }
        return _value.ToString("X");
    }
}

答案 1 :(得分:1)

请参阅此代码

private void button1_Click(object sender, EventArgs e)
{   
    string get = label1.Text.Substring(7); //label1.text=ATHCUS-100
    MessageBox.Show(get);
    string ou="ATHCUS-"+(Convert.ToInt32(get)+1).ToString();
    label1.Text = ou.ToString();

}

答案 2 :(得分:1)

我迟到了几年。但我希望我的回答能帮助每个人寻找一个好的ID生成器。以前的asnswers没有按预期工作,也没有回答这个问题。

我的回答非常符合要求。还有更多!!!

请注意,将_fixedLength设置为ZERO将创建动态大小的ID。 将其设置为其他任何内容都将创建FIXED LENGTH ID;

另请注意,调用带有当前ID的重载将“播种”该类,并且不需要使用另一个ID调用连续调用。除非您有随机ID,并且每个都需要下一个ID。

享受!

public static class IDGenerator
{
  private static readonly char _minChar = 'A';
  private static readonly char _maxChar = 'C';
  private static readonly int _minDigit = 1;
  private static readonly int _maxDigit = 5;     
  private static int _fixedLength = 5;//zero means variable length
  private static int _currentDigit = 1;
  private static string _currentBase = "A"; 

  public static string NextID()
  {                
    if(_currentBase[_currentBase.Length - 1] <= _maxChar)
    {
      if(_currentDigit <= _maxDigit)
      {
        var result = string.Empty;
        if(_fixedLength > 0)
        {             
          var prefixZeroCount = _fixedLength - _currentBase.Length;
          if(prefixZeroCount < _currentDigit.ToString().Length)
            throw new InvalidOperationException("The maximum length possible has been exeeded.");
          result = result = _currentBase + _currentDigit.ToString("D" + prefixZeroCount.ToString());
        }
        else
        {
          result = _currentBase + _currentDigit.ToString();
        }            
        _currentDigit++;
        return result;
      }
      else
      {
        _currentDigit = _minDigit;
        if(_currentBase[_currentBase.Length - 1] == _maxChar)
        {
          _currentBase = _currentBase.Remove(_currentBase.Length - 1) + _minChar;
          _currentBase += _minChar.ToString();
        }
        else
        {
          var newChar = _currentBase[_currentBase.Length - 1];
          newChar++;
          _currentBase = _currentBase.Remove(_currentBase.Length - 1) + newChar.ToString();
        }

        return NextID();
      }
    }
    else
    {         
        _currentDigit = _minDigit;
        _currentBase += _minChar.ToString();
       return NextID();            

    }      
  }

  public static string NextID(string currentId)
  {
    if(string.IsNullOrWhiteSpace(currentId))
      return NextID();

    var charCount = currentId.Length;
    var indexFound = -1;
    for(int i = 0; i < charCount; i++)
    {
      if(!char.IsNumber(currentId[i]))
        continue;

      indexFound = i;
      break;
    }
    if(indexFound > -1)
    {
      _currentBase = currentId.Substring(0, indexFound);
      _currentDigit = int.Parse(currentId.Substring(indexFound)) + 1;
    }
    return NextID();
  }
}

这是使用_fixedLength = 4和_maxDigit = 5的输出样本

A001 A002 A003 A004 A005 B001 B002 B003 B004 B005 C001 C002 C003 C004 C005 AA01 AA02 AA03 AA04 AA05 AB01 AB02 AB03 AB04 AB05 AC01 AC02 AC03 AC04 AC05

答案 3 :(得分:0)

运行此查询以获取数据库中的最后一个ID

SELECT TOP 1 [ID_COLUMN] FROM [NAME_OF_TABLE] ORDER BY [ID_COLUMN] DESC

将结果读取到变量,然后对结果运行以下函数以获取下一个ID。

public string NextID(string lastID)
{
    var allLetters = new string[] {"A", "B", "C", "D", "E", "F"};
    var lastLetter = lastID.Substring(0, 1);
    var lastNumber = int.Parse(lastID.Substring(1));

    if (Array.IndexOf(allLetters, lastLetter) < allLetters.Length - 1 && 
        lastNumber == 9999) 
    {
        //increase the letter
        lastLetter = allLetters(Array.IndexOf(allLetters, lastLetter) + 1);
        lastNumber = 0;
    } else {
        lastLetter = "!";
    }

    var result = lastLetter + (lastNumber + 1).ToString("0000");

    //ensure we haven't exceeded the upper limit
    if (result.SubString(0, 1) == "!") {
        result = "Upper Bounds Exceeded!";
    }

    return result;
}

<强>声明
此代码仅生成第一组ID。我不明白生成第二组的过程。

答案 4 :(得分:0)

如果您需要从数据库中取出并执行此操作,您可以使用以下内容。

int dbid = /* get id from db */
string id = dbid.ToString("X5");

这应该为您提供从数据库ID直接转换所需的格式。