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

6

字符串总长度为5个字符

我有一个场景,ID以A0001开头,以A9999结尾,然后是B0001到B9999,直到F0001到F9999

之后

从FA001到FA999,然后是FB001到FB999,一直到....FFFF9

请建议如何创建这种格式。

5个回答

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

首先感谢您的快速回复,我需要将信息存储在数据库中...每次我都会从数据库中获取最新的ID,基于该最新ID,我需要生成新的唯一ID。 - user294527
我不理解你的问题。在你最初的问题中,你清楚地描述了生成唯一ID号所需的算法。请重新陈述你的问题并解释生成给定某个ID的ID所使用的算法是什么。 - Darin Dimitrov
这个不起作用。生成的模式与问题建议的实际模式根本不接近。 - Jonathan Alfaro

4

虽然我晚了几年,但我希望我的答案能够帮助需要好的ID生成器的人。之前的回答都不能按照预期工作,也没有回答这个问题。

我的答案完全符合要求,而且更好!!!

请注意,将_fixedLength设置为零将创建动态大小的ID。将其设置为其他值将创建固定长度的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


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

}

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。我不理解生成第二组的过程。


0
如果您需要从数据库中获取数据并执行此操作,可以使用类似以下的代码:
int dbid = /* get id from db */
string id = dbid.ToString("X5");

这应该可以为您提供所需的格式,作为从数据库ID直接转换的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接