如何从以*
开头的文本文件中读取随机行我的文本文件有15000行。带有*字符的字符是问题,下面的行是与该问题相关的字词。
这是文件的一部分:
*Planete i njihovi sateliti
Zemlja=Mesec
Mars=Fobos
Jupiter=Io
Saturn=Titan
Uran=Titania
Neptun=Triton
Pluton=Haron
Merkur=Nema satelit
*Francuski gradovi
Bordeaux=Bordo
Auxerre=Okser
Toulouse=Tuluz
Nantes=Nant
Marseille=Marselj
Dijon=Dižon
Limoges=Limož
Chateauroux=Šatero
答案 0 :(得分:1)
将所有以*
开头的行读入列表,然后获取随机索引
并在开头摆脱*
。
var questions =
File.ReadLines(filePath)
.Where(line => line.StartsWith("*")).ToList();
var rng = new Random();
var myRandomQuestion = questions[rng.Next(questions.Count)].Substring(1);
<强>更新强>
如果你也需要以下几行,那么上面的工作就不行了 我首先建议你创建一些结构 例如:
public class QuestionAndTerms
{
public string Question {get; set;}
public List<string> Terms {get; set;}
}
然后,循环浏览文件并填写List<QuestionAndTerms>
。
var question = null;
foreach (string line in File.ReadLines(filePath))
{
if (line.StartsWith("*"))
{
if (question!= null)
{
// We have a previous question
questionList.Add(question);
}
question = new QuestionAndTerms();
question.Question = line.Substring(1);
}
if (!string.IsNullOrWhiteSpace(line))
{
question.Terms.Add(line);
}
}
或使用StremReader
using (var reader = File.OpenText(filePath))
{
// loop and logic here
}
以上所有内容只是为了给出方向,既不测试也不完整。
答案 1 :(得分:0)
首先,您必须决定如何将问题和答案表示为数据结构。我建议用适当的类来表示问题和答案(我使用的是VS 2017 / C#7.0语法):
public class Choice
{
public Choice (string choiceText, string answer)
{
ChoiceText = choiceText;
Answer = answer;
}
public string ChoiceText { get; }
public string Answer { get; }
}
public class Question
{
public Question (string questionText)
{
QuestionText = questionText;
}
public string QuestionText { get; }
public List<Choice> Choices { get; } = new List<Choice>();
}
现在您可以开始阅读文件并将问题和答案放入结构中
var questions = new List<Question>();
var Question lastQuestion = null;
foreach (string line in File.ReadLines(path)) {
if (line.StartsWith("*")) {
// We have a new question. Create a question object and add it to the list.
lastQuestion = new Question(line.Substring(1));
questions.Add(lastQuestion);
} else if (lastQuestion != null) {
// We have a term related to the last question. Add it to the last question.
// Split the line at the equal sign.
string[] parts = line.Split("=", StringSplitOptions.RemoveEmptyEntries);
if (parts.Length > 0) {
// We have at least one part that is not empty. Let’s assume it’s the part before
// the "=". If we have a second part, insert it as well, otherwise insert null.
var choice = new Choice(parts[0], parts.Length > 1 ? parts[1] : null);
lastQuestion.Add(choice);
}
}
}
但是,我注意到您的示例文件包含2种不同类型的问题。有些人在等号后有答案,而其他人有分开的选择和答案清单。因此,您必须扩展解决方案以考虑到这一点。
您的问题非常不明确,因此很难给您一个合适的答案。下一次,提前考虑并提出更具体,更精确的问题。此外,在Stack Overflow上,我们更愿意提供您到目前为止所尝试的代码示例。