永久在 while 循环中 c#,Visual Studio 2013

Permanently in while loop c# , Visual Studio 2013

使用我的代码,我应该能够从我的文件中随机调用一个问题,而不是再次重复使用该问题。

但由于某种原因,我陷入了 while 循环,经过几个小时的搜索,我仍然不明白为什么,所以我希望你们能帮助我。 (他在生成 8 个问题后卡住了)

代码(对于生成问题一,如果您需要更多,我可以粘贴它,但我希望这能提供足够的信息):

lineCount = File.ReadLines(pad).Count();
questions = new string[lineCount, 2];


public string GenerateQuestion(int total)
    {
        if (total <= 10)
        {
            Random ran = new Random();
            questionNumber = ran.Next(lineCount);
            while (previousQuestions.Contains(questionNumber))
            {
                questionNumber = ran.Next(lineCount);
            }

        }
        previousQuestions[questionCount] = questionNumber;
        questionCount++;
        return questions[questionNumber, 0];
    }

您可以创建一个方法 return 文件中的行以随机顺序排列。

public string[] GetQuestionsInRandomOrder()
{
    var lines = File.ReadAllLines("test.txt");
    var rnd = new Random();
    lines = lines.OrderBy(line => rnd.Next()).ToArray();
    return lines;
}

然后,当您使用这些问题时,您可以将它们从数组中删除。

var isRemoved = Array.remove(array, item);

https://msdn.microsoft.com/en-us/library/vstudio/bb397721%28v=vs.100%29.aspx

这比我以前做的更容易,而且会提供更好的控制。我会为此创建一个 class,这个示例是一个起点。您可以在进行过程中添加更多功能。通过使用 class 来完成所有这些工作,您可以添加方法以在以后执行其他功能,而无需重写代码。

public class Logic
{
    public List<string> AllQuestionsInRandomOrder { get; set; } 
    public List<string> QuestionsThatHaveBeenRemoved { get; set; }

    public Logic()
    {
        QuestionsThatHaveBeenRemoved = new List<string>();
        AllQuestionsInRandomOrder = GetQuestionsInRandomOrder().ToList();
    }

    public string GetUnusedQuestion()
    {
        var question =
            AllQuestionsInRandomOrder.FirstOrDefault(x => !QuestionsThatHaveBeenRemoved.Contains(x));
        QuestionsThatHaveBeenRemoved.Add(question);
        return question;
    }

    public IEnumerable<string> GetQuestionsInRandomOrder()
    {
        var lines = File.ReadAllLines("test.txt").ToList();
        var rnd = new Random();
        lines = lines.OrderBy(line => rnd.Next()).ToList();
        return lines;
    }

    public void RemoveQuestion(List<string> questions, string questionToRemove)
    {
        questions.Remove(questionToRemove);
    }
}         

我会避免使用循环并将问题分解为单独的方法或函数。这将使调试更容易。此实现不会将问题和答案分开,因此您需要添加一种方法,return 是问题和答案的字典。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            var questions = new Questions();
            var firstQuestion = questions.GetUnusedQuestion();
            Console.WriteLine(firstQuestion);
        }
    }

    class Questions
    {

        public string FileName { get; set; }
        public static List<string> AllQuestionsAndAnswersFromFile { get; set; } 
        public List<string> AllQuestionsInRandomOrder { get; set; }
        public List<string> QuestionsThatHaveBeenRemoved { get; set; }

        public Questions()
        {
            FileName = "text.txt";
            QuestionsThatHaveBeenRemoved = new List<string>();
            AllQuestionsAndAnswersFromFile = new List<string>();
            ReadQuestionsFromFile();
            AllQuestionsInRandomOrder = GetQuestionsInRandomOrder().ToList();
        }

        public string GetUnusedQuestion()
        {
            var question =
                AllQuestionsInRandomOrder.FirstOrDefault(x => QuestionsThatHaveBeenRemoved.Contains(x));
            QuestionsThatHaveBeenRemoved.Add(question);
            return question;
        }

        private static IEnumerable<string> GetQuestionsInRandomOrder()
        {
            var lines = AllQuestionsAndAnswersFromFile;
            var rnd = new Random();
            lines = lines.OrderBy(line => rnd.Next()).ToList();
            return lines;
        }

        public void RemoveQuestion(List<string> questions, string questionToRemove)
        {
            questions.Remove(questionToRemove);
        }

        public void ReadQuestionsFromFile()
        {
            using (var reader = new StreamReader(FileName, Encoding.Default))
            {
                var text = reader.ReadToEnd();
                var lines = text.Split('=');
                foreach (var s in lines)
                {
                    AllQuestionsAndAnswersFromFile.Add(s);
                }
            }
        }
    }
}

当你运行出了问题,我们来看看

while (previousQuestions.Contains(questionNumber))
{
    questionNumber = ran.Next(lineCount);
}

实际上是:

  • questionNumber 是我们已经提出的问题之一吗?
  • 是的,获取新的问题编号。 (因为我们问了所有问题)
  • questionNumber 是我们已经提出的问题之一吗?
  • 是的,获取新的问题编号。 (因为我们问了所有问题)

在这种情况下,一个解决方案是打乱您 return 的问题,在您抓取它们时将其移除。