2010-03-16 34 views
5

Tổng chiều dài chuỗi 5 ký tựAuto Tạo Id Unique chữ và số với C#

Tôi có một kịch bản, ID bắt đầu với

A0001 và kết thúc với A9999 thì B0001 đến B9999 cho đến F0001 để f9999

sau đó

FA001 để FA999 sau đó FB001 để FB999 cho đến khi .... FFFF9

Pleas e đề xuất bất kỳ ý tưởng nào về cách tạo định dạng này.

Trả lời

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

Bạn cũng có thể có một lớp phát 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

nhờ đầu tiên cho câu trả lời nhanh chóng, giống như tôi cần phải lưu trữ các thông tin trong DB ... mỗi lần tôi sẽ nhận được ID mới nhất từ ​​DB dựa trên ID mới nhất mà tôi cần tạo ID Uniqu mới. – user294527

+0

Tôi không hiểu bạn đang hỏi gì. Trong câu hỏi ban đầu của bạn, bạn đã mô tả rõ ràng thuật toán cần thiết để tạo số ID duy nhất. Đặt lại câu hỏi của bạn và giải thích thuật toán được sử dụng để tạo ID cho một số ID khác là gì. –

+0

Điều này không hoạt động. Các mô hình sản xuất thậm chí không gần với mô hình thực tế sugested bởi câu hỏi – Darkonekt

0

Chạy truy vấn này để có được ID cuối cùng trong cơ sở dữ liệu

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

đọc kết quả cho một biến và sau đó chạy hàm sau trên kết quả để lấy ID tiếp theo.

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

SỰ TỪ BỎ
Mã này sẽ chỉ tạo ra tập đầu tiên của ID. Tôi không hiểu quá trình tạo tập thứ hai.

0

Nếu bạn cần lấy nó từ cơ sở dữ liệu và làm điều này bạn có thể sử dụng một cái gì đó như sau.

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

Điều này sẽ cung cấp cho bạn định dạng bạn đang tìm kiếm dưới dạng chuyển đổi trực tiếp từ ID DB.

1

thấy mã này

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

Tôi là một vài năm cuối. Nhưng tôi hy vọng câu trả lời của tôi sẽ giúp mọi người tìm kiếm một Trình tạo ID tốt. NON của các asnswers trước đó hoạt động như mong đợi và không trả lời câu hỏi này.

Câu trả lời của tôi phù hợp với yêu cầu một cách hoàn hảo. Và hơn thế nữa!!!

Lưu ý rằng việc đặt _fixedLength thành ZERO sẽ tạo ID có kích thước động. Đặt nó thành bất kỳ thứ gì khác sẽ tạo ID LENGTH ID của FIXED;

Cũng lưu ý rằng việc gọi quá tải có ID hiện tại sẽ "hạt giống" lớp và các cuộc gọi liên tiếp KHÔNG cần phải được gọi bằng ID khác. Trừ khi bạn có ID ngẫu nhiên và cần có ID tiếp theo trên mỗi ID.

Tận hưởng!

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

Đây là một mẫu của các ouput sử dụng _fixedLength = 4 và _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

Các vấn đề liên quan