Как сделать, чтобы считывания вопросов с .txt файла были в рандомно порядке?
Проблема заключается в том, что мне нужно сделать рандомно считывания и вывод вопросов с .txt файла. Сейчас у меня все вопросы идут по очереди. Для каждого вопроса у меня в файле выделяется 6 строк (1 - вопрос, 2-5 - ответы, 6 - правильный ответ).
void Begining()
{
var Кодирования= System.Text.Encoding.GetEncoding(1251);
try
{
// Создание экземпляра StreamReader для чтения из файла
Reader = new System.IO.StreamReader(filename);
this.Text = Reader.ReadLine(); // Название теста
}
catch (Exception Event)
{ // Звіт про всі помилки:
MessageBox.Show(Event.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
NextQuestion();
}
void NextQuestion()
{
label1.Text = Reader.ReadLine();
// Считывания вариантов ответа:
radioButton1.Text = Reader.ReadLine();
radioButton2.Text = Reader.ReadLine();
radioButton3.Text = Reader.ReadLine();
radioButton4.Text = Reader.ReadLine();
// Определение правильного ответа:
NRA = int.Parse(Reader.ReadLine());
}
Ответы (1 шт):
Попытаюсь просто, вводя минимум новых непонятных слов в пример и добавлю чуть-чуть обучающей информации.
1) Создайте класс, который будет хранить вопрос и все ответы
public class QuestionItem
{
public string Question { get; set; } // Так описывается свойство объекта
public string Radio1 { get; set; } // Почитайте про свойства, поля и чем они отличаются
public string Radio2 { get; set; }
public string Radio3 { get; set; }
public string Radio4 { get; set; }
public int Answer { get; set; }
}
2) Создайте список с вопросами
List<QuestionItem> questions = new List<QuestionItem>();
3) Загрузите весь файл в строку
ВНИМАНИЕ! Файл должен быть в кодировке UTF-8, забудьте про кодировку Win-1251 как про пережиток прошлого времён Windows XP. Если файл не перекодирован, его можно перекодировать, например с помощью текстового редактора Notepad++.
string text;
try
{
text = File.ReadAllText("filename.txt"); // вот так просто
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при чтении файла");
}
// и сразу можно разбить загруженный текст на строки,
// пустые строки автоматически при этом удалятся
string[] lines = text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
или еще предлагают вот так
string[] lines;
try
{
lines = File.ReadAllLines("filename.txt");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при чтении файла");
}
4) Загрузите вопросы из массива строк в список вопросов
int questionsCount = lines.Length / 6; // вопросов в 6 раз меньше, чем строк
for (int i = 0; i < questionsCount; i++)
{
int offset = i * 6; // номер первой строки с вопросом
QuestionItem question = new QuestionItem(); // новый вопрос
question.Question = lines[offset];
question.Radio1 = lines[offset + 1];
question.Radio2 = lines[offset + 2];
question.Radio3 = lines[offset + 3];
question.Radio4 = lines[offset + 4];
question.Answer = int.TryParse(lines[offset + 5], out int answer) ? answer : 0; // 0 - значение на случай если произошла ошибка превращения строки в число
questions.Add(question); // добавить вопрос в список
}
5) Теперь можно получить случайный вопрос с помощью генератора случайных чисел
Random rndGenerator = new Random(); // это можно создать один раз при загрузке программы
// ...
int n = rndGenerator.Next(questions.Count()); // n - порядковый номер вопроса
QuestionItem q = questions[n]; // вот он, случайный вопрос!
// дальше ваш код
label1.Text = q.Question;
radioButton1.Text = q.Radio1;
radioButton2.Text = q.Radio2;
radioButton3.Text = q.Radio3;
radioButton4.Text = q.Radio4;
NRA = q.Answer;
Я умышленно не сделал следующие вещи, но вам советую с этим разобраться:
- Список вариантов ответов лучше хранить массивом
string[], доработайте код - Поддержка динамического количества ответов на один вопрос была бы очень кстати, например 3 ответа, или 6