C#return不退出该函数

时间:2015-04-05 21:37:37

标签: c# return

所以,我正在编写一个函数,从字典中询问一个随机问题,直到问到所有问题,然后我遇到了一个问题。当随机生成的数字列表已包含新生成的数字时,程序将调用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;
    }

2 个答案:

答案 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;
}