所以,我正在编写一个函数,从字典中询问一个随机问题,直到问到所有问题,然后我遇到了一个问题。当随机生成的数字列表已包含新生成的数字时,程序将调用Ask函数。但是,当它到达最终返回行时,它再次调用函数Ask,而不是返回数字列表。
static List<int> Ask(Dictionary<string,string> Questions, List<int> random, int count)
{
bool contains = false;
var rando = new Random();
int num = Convert.ToInt32(rando.Next(0, count));
if (random.Count >= count)
{
Console.WriteLine("No more questions! Quitting");
System.Environment.Exit(1);
}
foreach (int number in random)
{
if (number == num)
{
contains = true;
}
}
if (contains == true)
{
Ask(Questions, random, count);
}
random.Add(num);
var randomEntry = Questions.ElementAt(num);
String randomKey = randomEntry.Key;
String randomValue = randomEntry.Value;
Console.WriteLine(randomKey);
if (Console.ReadLine() == randomValue)
{
Console.WriteLine("Correct!");
}
else
{
Console.WriteLine("Wrong!");
}
return random;
}
答案 0 :(得分:1)
你的代码有点乱。但是在递归调用函数后random
var没有更新。试试这个:
random = Ask(Questions, random, count);
答案 1 :(得分:1)
我认为问题出在你对函数Ask的递归调用中。当您退出递归调用时,您仍然在Ask方法中的上一个调用中,并且无法避免在Ask调用之后的其余代码。
我不认为你真的需要一个递归方法。只需检查生成的随机数是否已经在您的问题列表中,并重复随机生成,直到您找到之前没有问过的问题....
这里重构代码的变量名称不那么令人困惑
List<int> Ask(Dictionary<string,string> Questions, int count)
{
List<int> askedList = new List<int>();
var rnd = new Random();
int questionIndex = rnd.Next(0, count);
while(askedList.Count < count)
{
if(!askedList.Any(number => number == questionIndex))
{
askedList.Add(questionIndex);
var questionEntry = Questions.ElementAt(questionIndex);
string questionText = questionEntry.Key;
string questionAnswer = questionEntry.Value;
Console.WriteLine(questionText);
if (Console.ReadLine() == questionAnswer)
{
Console.WriteLine("Correct!");
}
else
{
Console.WriteLine("Wrong!");
}
}
questionIndex = rnd.Next(0, count);
}
return askedList;
}