2010-03-16 10 views

risposta

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

Si potrebbe anche avere una classe di generatore di 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"); 
    } 
} 
+0

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

+0

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. –

+0

Questo non funziona. Il modello prodotto non è nemmeno vicino al modello reale suggerito dalla domanda – Darkonekt

0

eseguire questa query al fine di ottenere l'ultimo ID nel database

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

Leggere il risultato a 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 gruppo di ID. Non capisco il processo di generazione del secondo set.

0

Se è necessario prenderlo dal database e farlo, è possibile utilizzare 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.

1

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

} 
1

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