Мой метод GetUniqueID заканчивается переполнением рекурсии? - PullRequest
0 голосов
/ 18 мая 2018

В настоящее время я пытаюсь создать метод, который возвращает новый «id» в виде целого числа на основе существующей коллекции словарей с типами TKey, TValue: int, ListButton.

Я пришелпока немного кода, но я очень недоволен «тестируемостью в определенном сценарии».

Мой вопрос следующий:

  1. Будет ли следующееКод создает «RecursionOverflow», если оператор while (ContainsKey (randomNumber)) достигает значения true и возвращает тот же метод снова, пока первый цикл все еще выполняется, поскольку первый вызов предоставил истинное выражение?

  2. Или он вернет уникальный номер из так называемого «второго вызова метода» внутри цикла while и завершит первое время с помощью return?

    private int GetUniqueID(){ 
        var randomNumber = Random.Range(0,1000); 
        while (ListButtons.ContainsKey(randomNumber)) 
        { 
            return GetUniqueID(); 
        }
        return randomNumber; 
    }  
    

1 Ответ

0 голосов
/ 18 мая 2018

Да, это будет «работать» - пока в словаре не будет ключ для каждого значения в диапазоне. В этом случае вы получите StackOverflowException.

Вы все равно можете получить StackOverflowException, даже если технически возможно приземлиться на уникальный номер - это зависит от того, насколько велик ваш диапазон, сколько осталось уникальных чисел и насколько вам не повезло.

Также рассмотрим ситуацию, когда ваш словарь содержит все ключи от 0 до 1000, кроме одного. Это может занять тысячи рекурсий, прежде чем ваше случайное число попадет на это окончательное число.

Так что да, хотя это может сработать, это не лучший способ генерировать уникальные идентификаторы.

Альтернативное решение может состоять в создании класса генератора идентификаторов, который раздает числа последовательно, поддерживая член «nextId» и увеличивая его каждый раз, когда раздает идентификатор, немного похоже на то, как базы данных дают идентификаторы для записей со столбцом идентификаторов. .

Другое решение состоит в том, чтобы использовать GUID для своих идентификаторов вместо целых.

...