我希望创建一个在线测验,可以从数千个编程问题中提出任何问题。每个问题都是通过一个函数创建的,该函数被赋予一个 int 数组,其值决定了所显示的确切问题。我把每个问题作为一个类(class):

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 数组(以准确确定创建的问题),将其提供给 QuestionAnswer 以创建问题和答案。

我想要一个可通过 List 搜索的 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());}
            }
        }
    }
}

所以我的问题是哪个更好?我是创建数千个类,必须为每个类提供一个名称,还是创建数千个匿名函数和一个使用(我假设)委托(delegate)存储这些函数的类?如果我有成千上万的问题,或者有更好的方法来解决这个问题,第二个解决方案是否有问题?

(显然我希望创建的问题比这里显示的要复杂得多,并且涉及分数、代数等)

最佳答案

只是为了让您开始使用流畅的语法,并在其中加入一些 stub 和想法。

class Question
{
    public string Name { get; set; }
    public string QuestionFormat { get; set; }
    public List<Range> Args { get; set; }
    public Expression<Func<int[], int>>  ValExp { get; set; }

    public Question(string name, string questionFormat)
    {
        this.Name = name;
        this.QuestionFormat = questionFormat;
        this.Args = new List<Range>();
    }

    public Question Rand(int min, int max)
    {
        this.Args.Add(new Range(min, max));
        return this;
    }

    public void Val(Expression<Func<int[], int>> exp)
    {
        this.ValExp = exp;
    }

    public CompiledQuestion Compile()
    {
        // Generate args in the appropriate ranges
        // Evaluate the result with the ValExp
        // Return a new CompiledQuestion with the information -
        //    basically just replacing Args, ValExp with RealArgs, Val
    }

    public ICoolDataObject Save()
    {
    }

    public static Question Load(ICoolDataObject hmm)
    {
    }
}

class Range
{
    public int Min { get; set; }
    public int Max { get; set; }

    public Range(int min, int max)
    {
        this.Min = min;
        this.Max = max;
    }
}

这几乎很有趣,现在创建问题:
new Question("simple addition",
             "whats {0} + {1}?")
    .Rand(10, 99)
    .Rand(10, 99)
    .Val(v => v[0] + v[1]);

您显然可以添加一些验证检查,以避免由于工作时间过晚而导致参数数量错误,并在任何地方使用 doubledecimal 而不是 int

关于c# - 匿名函数列表或数千个类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28454220/

10-11 03:25
查看更多