soy unos años de retraso. Pero espero que mi respuesta ayude a todos a buscar un buen ID Generator. NON de las respuestas anteriores funcionan como se esperaba y no responden a esta pregunta.
Mi respuesta se ajusta perfectamente a los requisitos. ¡¡¡Y más!!!
Observe que establecer _fixedLength en ZERO creará ID de tamaño dinámico. Al establecerlo en cualquier otra parte, se crearán ID de LONGITUD FIJA;
Tenga en cuenta también que llamar a la sobrecarga que toma una identificación actual "sembrará" la clase y las llamadas consecutivas NO necesitan ser llamadas con otra ID. A menos que tengas identificaciones aleatorias y necesites la siguiente en cada una.
¡Disfrútalo!
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();
}
}
Este es un ejemplo de que la salida usando _fixedLength = 4 y _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
primer lugar gracias por la rápida respuesta, como que necesito para almacenar la información en la base de datos ... cada vez que obtengo la última ID de DB basada en esa última ID, necesito generar una nueva ID de Uniqu. – user294527
No entiendo lo que estás preguntando. En su pregunta original, describió claramente el algoritmo necesario para generar números de identificación únicos. Repita su pregunta y explique cuál es el algoritmo utilizado para generar una identificación con alguna otra ID. –
Esto no funciona. El patrón producido ni siquiera está cerca del patrón real sugerido por la pregunta – Darkonekt