Sono un paio di anni di ritardo. Ma spero che la mia risposta aiuti tutti coloro che cercano un buon generatore di ID. NON delle precedenti risposte funzionano come previsto e non rispondono a questa domanda.
La mia risposta soddisfa perfettamente i requisiti. E molto altro !!!
Si noti che l'impostazione di _fixedLength su ZERO creerà ID di dimensioni dinamiche. Impostandolo su qualsiasi altra cosa si creeranno ID LUNGHEZZA FISSO;
Si noti inoltre che la chiamata al sovraccarico che richiede un ID corrente "semina" la classe e le chiamate consecutive NON devono essere chiamate con un altro ID. A meno che tu non abbia un ID casuale e abbia bisogno del prossimo su ciascuno.
Divertiti!
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();
}
}
Questo è un esempio di output utilizzando _fixedLength = 4 e _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
primi grazie per la risposta rapida, come ho bisogno di memorizzare le informazioni nel DB ... ogni volta che otterrò l'ultimo ID dal DB basato su quell'ultimo ID, ho bisogno di generare un nuovo ID Uniqu. – user294527
Non capisco cosa stai chiedendo. Nella tua domanda iniziale hai chiaramente descritto l'algoritmo necessario per generare numeri ID univoci. Riesamina la tua domanda e spiega qual è l'algoritmo utilizzato per generare un ID dato qualche altro ID. –
Questo non funziona. Il modello prodotto non è nemmeno vicino al modello reale suggerito dalla domanda – Darkonekt