Увеличение уникального поля с указанным шаблоном символов - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь найти способ увеличить определенный пользователем идентификатор. Я написал что-то, что дает то, что я хочу, чтобы код делал, но я очень сомневаюсь, что это лучший способ сделать это:

Шаблон символов:

AAA000
AAA999
BAA000
BAA999
BBA000

И так далее, хотя:

AAA000
AAA999
BAA000
BAA999
CAA000

Будет приемлемым.

Вот мой код для генерации этого шаблона:

int i = 30;

char char1 = 'A';
char char2 = 'A';
char char3 = 'A';
double number = 998;

for (int j = 0; j < i; j++)
{
    string id = $"{char1}{char2}{char3}{number.ToString().PadLeft(3, '0')}";

    if (number == 999)
    {
        number = 998;

        if (char1 == char2 && char1 == char3 && char1 != 'Z')
        {
            char1++;
        }
        else if (char1 > char2 && char2 != 'Z')
        {
            char2++;
        }
        else if (char3 != 'Z')
        {
            char3++;
        }
    }
    else
    {
        number++;
    }

    Console.WriteLine(id);
}

Чтобы пояснить, мне нужно создать функцию, которая может принимать последнее значение, например:

DEF123, который в свою очередь вернет: DEF124

или DEF999, который вернет DEG000.

Используя ответ Maximillians, я изменил метод:

    static void NextId(string highestId)
    {
        char startChar1 = highestId[0];
        char startChar2 = highestId[1];
        char startChar3 = highestId[2];
        int startNumber = int.Parse(highestId.Substring(highestId.Length - 3));

        int n = 1;
        int i = 0;

        for (char char1 = startChar1; char1 <= 'Z' && i < n; char1++)
        {
            for (char char2 = startChar2; char2 <= 'Z' && i < n; char2++)
            {
                for (char char3 = startChar3; char3 <= 'Z' && i < n; char3++)
                {
                    for (int number = startNumber; number < 1000 && i < n; number++)
                    {
                        string id = $"{char1}{char2}{char3}{number.ToString().PadLeft(3, '0')}";
                        Console.WriteLine(id);
                        i++;
                    }
                }
            }
        }
    }

Это почти идеально , за исключением:

DEZ998 возвращает DEZ998, DEZ999 является наивысшим идентификатором, передаваемым в возвратах DEZ999.

Любые рекомендации по достижению этой цели будут очень полезны.

1 Ответ

1 голос
/ 04 мая 2020

Я должен был сделать некоторые предположения относительно вашего паттерна, но насколько я понял ваш вопрос, я бы использовал вложенные циклы вместо одного l oop, чтобы управлять ими всеми.

int n = 30;
int i = 0;

for (char char1 = 'A'; char1 <= 'Z' && i < n; char1++)
{
    for (char char2 = 'A'; char2 <= 'Z' && i < n; char2++)
    {
        for (char char3 = 'A'; char3 <= 'Z' && i < n; char3++)
        {
            for(int number = 0; number < 1000 && i < n; number++)
            {


                string id = $"{char1}{char2}{char3}{number.ToString().PadLeft(3, '0')}";
                Console.WriteLine(id);
                i++;
            }
        }
    }
}

Это будет:

  1. Увеличивать число с 0 до 999
  2. После этого оно будет увеличивать Char1 на единицу и начинать снова с (1.), пока не будет достигнуто Z
  3. После этого он будет увеличивать Char2 на единицу и начинать снова с (2.) до достижения Z
  4. После этого он будет увеличивать Char3 на единицу и начинать снова с (3.) до * Достигнуто 1017 *

Остановится в любой момент, если будет достигнута максимальная сумма (n)

→ Вы получите максимальное количество 17575999 возможных уникальных идентификаторов


Обновление:

Метод GetNextId(Tuple<char, char, char, int> id) может помочь вам в этом. Он вычисляет следующий идентификатор в зависимости от предыдущего.

void GenerateIDs()
{
    char char1 = 'B';
    char char2 = 'F';
    char char3 = 'A';
    int number = 159;
    int n = 30;

    // this one is the current ID
    var iterationId = new Tuple<char, char, char, int>(char1, char2, char3, number);
    for(int i = 1; i < n; i++)
    {
        iterationId = GetNextId(iterationId);
        Console.WriteLine(IdToString(iterationId));
    }
}

/// returns: c1Next, c2Next, c3Next, numberNext
private Tuple<char, char, char, int> GetNextId(Tuple<char, char, char, int> id)
{
    var number = id.Item4 + 1;
    var c3 = id.Item3;
    var c2 = id.Item2;
    var c1 = id.Item1;

    if(number > 999)
    {
        number = 0;
        c3++;
        if(c3 > 'Z')
        {
            c3 = 'A';
            c2++;
            if (c2 > 'Z')
            {
                c2 = 'A';
                c1++;
                if(c1 > 'Z')
                {
                    throw new IndexOutOfRangeException("Next ID bigger than \"ZZZ999\"");
                }
            }
        }
    }

    return new Tuple<char, char, char, int>(c1, c2, c3, number);
}

private string IdToString(Tuple<char, char, char, int> id)
{
    return $"{id.Item1}{id.Item2}{id.Item3}{id.Item4.ToString().PadLeft(3, '0')}";
}

Альтернативно

Вы можете просто сохранить int в базе данных и использовать значения 0 до 17575999, а затем рассчитать ID дисплея

private string IntToId(int intId)
{
    var number = intId % 1000;
    intId /= 1000;
    char c3 = (char) ('A' + (intId % 26));
    intId /= 26;
    var c2 = (char) ('A' + (intId % 26));
    intId /= 26;
    var c1 = (char) ('A' + (intId % 26));

    return $"{c1}{c2}{c3}{number.ToString().PadLeft(3, '0')}";
}

private int IdToInt(string id)
{
    int c1 = id[0] - 'A';
    int c2 = id[1] - 'A';
    int c3 = id[2] - 'A';
    int number = Int32.Parse(id.Substring(3));
    return ((((((c1 * 26) + c2) *26) + c3) * 1000) + number);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...