读取文本文件并将某些行分配给某些变量

时间:2014-04-23 21:34:14

标签: c# arrays string

我正在开发一个Trivia C#控制台游戏,它读取一个有问题的文本文件,回答多个选项,正确选择的数量和答案解释。有四个问题集。任务是提示每个问题在文件到控制台窗口中,让用户输入答案,然后将用户的答案与正确答案进行比较。应该对文件中的所有四个问题进行处理。

包含问题的类,multipleAnswewrChoice,correctAnswer和answerExplanation已经为每个字段创建了getter和setter。

我正在努力的是在阅读文件之后,将每个问题分配给某个变量以便将其提示给用户以及为四个集合执行此操作。 我创建了一个大小为4的数组(因为我为每个问题集设置了4行)来存储行然后将每个元素分配给上面的每个变量,但我无法弄清楚如何循环以对所有四个集合执行相同操作。

QuestionUnit是包含问题字段的类。

 public void ReadQuestionFile( QuestionUnit unit)
        {
            string[] arrayReader = new string[4];
            string line = "";
            int i = 0;
            string fileName = "TextFile1.txt";
            StreamReader myReader = new StreamReader(fileName);
            while ((line = myReader.ReadLine()) != null && i < 4 )
            {

                arrayReader[i] = line;
                // Console.WriteLine(line);

                //Console.WriteLine(arrayReader[i]);
                i++;

            }
           unit.M_Question  = arrayReader[0];
            unit.M_Answers = arrayReader[1];
            unit.M_CorrectAnswers = arrayReader[2];
            unit.M_Explanation = arrayReader[3];


        }

关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

因为您的所有数据都在同一个文件中,所以您需要采取稍微不同的方法。我没有传入要填写的项目,而是让函数返回读取问题列表:

public IEnumerable<QuestionUnit> ReadQuestionFile()

然后,循环读取,直到到达文件末尾。这种方法对于无效输入是不安全的,所以要小心:

string fileName = "TextFile1.txt";
List<QuestionUnit> readQuestions = new List<QuestionUnit>();
using (StreamReader myReader = new StreamReader(fileName))
{
    while (!myReader.EndOfStream)
    {
        QuestionUnit newQuestion = new QuestionUnit();
        newQuestion.M_Question  = myReader.ReadLine();
        newQuestion.M_Answers = myReader.ReadLine();
        newQuestion.M_CorrectAnswers = myReader.ReadLine();
        newQuestion.M_Explanation = myReader.ReadLine();

        readQuestions.Add(newQuestion);
    }
}
return readQuestions;

基本上,你一直读到文件的末尾,一次读四行。如果输入格式不正确,您将获得一些空值。你真的不需要一个数组,因为你可以直接将值存储在你的对象中,然后在你完成填充后添加到列表中(技术上你也可以在之前完成它)。然后将填写的列表返回到使用它的任何内容。

您可以使用yield return而不是直接添加到列表中,但这有点像开始的高级概念,我不确定它与File I /的网格有多好O.无论哪种方式都要意识到它的存在是很好的。唯一的变化是删除readQuestions和行:

yield return newQuestion;

目前对Add的调用是。

让我知道我是否可以澄清任何事情!