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