Genera automaticamente ID univoco alfanumerico con C #

La lunghezza totale della stringa è di 5 caratteri

Ho uno scenario, ID inizia con

A0001 e termina con A9999 poi da B0001 a B9999 fino a F0001 fino a999999

dopo di che

Da FA001 a FA999 quindi da FB001 a FB999 fino a …. FFFF9

Si prega di suggerire qualsiasi idea su come creare questo formato.

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

Potresti anche avere una class di id 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"); } } 

guarda questo codice

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

Ho qualche anno 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 class 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.

Godere!

 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 dell’output che utilizza _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

Esegui questa query per ottenere l’ultimo ID nel database

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

Leggere il risultato in una variabile e quindi eseguire la seguente funzione sul risultato per ottenere il prossimo 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; } 

NEGAZIONE
Questo codice genererà solo il primo set di ID. Non capisco il processo di generazione del secondo set.

Se hai bisogno di prenderlo dal database e farlo puoi usare qualcosa come il seguente.

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

Questo dovrebbe darti il ​​formato che stai cercando come conversione diretta dall’ID DB.