Редактировать Я только что понял, что не совсем точно ответил на вопрос, почему он останавливает ПК, потому что у вас бесконечный цикл в коде.
Проблема возникает в следующих строках кода, обратите внимание, что происходит.
case "create":
returnValue[a] = GetRandomInt(intCount);
goto case "check";
В приведенном выше блоке кода вы генерируете число и помещаете его в массив returnValue
. Теперь вы прыгаете в свой блок "проверки"
case "check":
bool alreadyTaken = false;
for (int c = 0; c < returnValue.Length - 1; c++)
{
if (returnValue[a] == returnValue[c])
{
// Already Taken!
alreadyTaken = true;
}
}
В этом блоке кода вы перебираете весь массив returnValue
, включая только что вставленное в него значение. По сути, вы перебираете массив, спрашивая, есть ли в массиве значение, которое вы только что поместили в массив.
Не зная точно, что вы пытаетесь сделать с помощью этих методов, я просто сделаю простое предложение по исправлению с некоторой незначительной очисткой
public static int[] GetUniqueInt(int count, int length)
{
var returnValue = new int[count];
var values = new HashSet<int>(); // Used to track what numbers we have generated
for (int i = 0; i < count; ++i)
{
// Generate the number and check to be sure we haven't seen it yet
var number = GetRandomInt(length);
while(values.Contains(number)) // This checks if the number we just generated exists in the HashSet of seen numbers
{
// We get here if the HashSet contains the number. If we have
// seen the number then we need to generate a different one
number = GetRandomInt(length);
}
// When we reach this point, it means that we have generated a new unique number
// Add the number to the return array and also add it to the list of seen numbers
returnValue[a] = number;
values.Add(number); // Adds the number to the HashSet
}
Debug.Log(returnValue);
return returnValue;
}
Я закончил тем, что удалил использование intLength
, но из вашего опубликованного кода он использовался только для объявления массива temp
, который сам по себе никогда не использовался. Исходя из этого, я только что полностью удалил.
На основании вашего комментария я обновил исправление для использования intLength
. Я сделал еще одно небольшое изменение. Я удалил int
из имен переменных count
и length
. Венгерская нотация встречается в коде C # гораздо реже. Лично я чувствую, что код чище и легче читать без венгерской нотации. Ключ должен использовать хорошие имена переменных, которые выражают намерение или облегчают следовать. В этом случае count
- это количество (считайте общее число) номеров, которые вы хотите вернуть, а length
- это длина номера. Возможно, вы могли бы даже переименовать его в numberOfDigits
, чтобы было яснее, что идея в том, что вы собираетесь создать случайное число с таким количеством цифр.