我希望创建一个在线测验,可以从数千个编程问题中随机抽取任何问题进行提问。每个问题都是通过一个函数创建的,该函数接收一个整数数组作为参数,其值确定显示的确切问题。我已将每个问题作为一个类:
public class AddingTwoDigitNumbers : IQuestion
{
public string QName() { return "Adding Two-Digit Numbers" };
public int[] QParams() { return int[]() {Random(10, 99), Random(10, 99) };
public void Question(int[] values) {
Console.WriteLine(string.Format("What is {1} + {2}?", values[0], values[1]);
}
public void Answer(int[] values) {
Console.WriteLine(values[0] + values[1]).ToString());
}
}
QParams
创建一个int数组(用于确定所创建的问题),然后将其传递给Question
和Answer
来创建问题和答案。
我希望能够通过QName
搜索到问题列表,但不想创建(和命名)成千上万个实现IQuestion
的类。
因此,这是我的第二个解决方案:
public class Question
{
public string QName { get; set; }
public Func<int[]> QParams { get; set; }
public Action<int[]> Question { get; set; }
public Action<int[]> Answer { get; set; }
}
public class QuestionRepository
{
public static Dictionary<string, Question> Questions = new Dictionary<string, Question>();
public static void AddQuestions(Question[] qs) {
foreach (Question q in qs) Questions.Add(q.QName, q);
}
}
public class FirstSetOfQuestions
{
static void AddQuestions()
{
QuestionRepository.AddQuestions(new Question[]
{
new Question()
{
QName = "Adding Two-Digit Numbers",
QParams = () => int[]() {Random(10, 99), Random(10, 99) },
Question = (v) => {Console.WriteLine(string.Format("What is {1} + {2}?", v[0], v[1]);},
Answer = (v) => {Console.WriteLine(values[0] + values[1]).ToString());}
},
new Question()
{
QName = "Subtracting Three-Digit Numbers",
QParams = () => int[]() {Random(100, 999), Random(100, 999) },
Question = (v) => {Console.WriteLine(string.Format("What is {1} - {2}?", v[0], v[1]);},
Answer = (v) => {Console.WriteLine(values[0] - values[1]).ToString());}
}
}
}
}
我的问题是哪种方法更好?我应该创建数千个类,为每个类提供名称,还是创建数千个匿名函数并使用(我假设)委托将它们存储在一个类中?如果我有成千上万个问题,第二种解决方案是否存在问题,或者有更好的方法来解决这个问题?(显然,我想要创建的问题比这里展示的复杂得多,涉及分数,代数等)。
"x + y = Math.PI"
)。稍后编译它时,可以使用CSharpCodeProvider
,根据需要添加所需的命名空间和变量声明。 - SimpleVarIQuestion
实现捆绑在一起成为程序集(例如,“三角函数问题”)。在运行时作为插件加载它们,并在需要添加另一个问题时保持测验“核心”不变。使用带有C#代码和某种管理工具的数据库是无法帮助您的,因为那样您将需要良好的代码和/或表达式编辑器(而现在您已经拥有它 - Visual Studio)。 - Dennis