【问题标题】:Looping through a list and matching several conditions循环遍历列表并匹配多个条件
【发布时间】:2017-03-24 13:08:30
【问题描述】:

我正在尝试创建一种对测验进行评分的方法。如果测验问题只有一个正确答案,它工作正常,但我很难处理多个正确答案。

我首先检查当前问题有多少正确答案。如果它大于 1,我需要一种方法来检查用户的答案是否与正确答案完美匹配。

所以,如果有一个问题有 2 个正确答案,而用户只签了其中 1 个,他不会得到分数。

关于检查正确答案的数量是否与正确答案匹配的方法有什么想法吗?

我认为 LINQ 很适合这里,但我完全是个菜鸟。也许将所有正确答案添加到新列表并与 .Contains 匹配将是一个解决方案?

类看起来像:

List<Question>

Question-Class
- List<Answers>
    -(string) AnswerText
    -(bool) CorrectAnswer

- List<string> UserAnswerToQuestionText

伪代码:

if (currentquestion has more than one correct answer)
if (UserAnswerText == correctAnswerX && UserAnswerText == correctAnswerY) 

nrofCorrectAnswers++;

【问题讨论】:

    标签: c# asp.net loops if-statement conditional


    【解决方案1】:

    应该可以用 linq 做到这一点

    所以这取决于你如何为问题和答案建模。

    为您的问题创建一个类,然后为您的答案创建一个类,如下所示,您的问题类可能包含一个答案列表:

    public class Question
    {
        public int QuestionId {get; set;}
        public string QuestionText {get; set;}
        public List<Answer> Answers {get; set;
    }
    
    public class Answer
    {
        public int AnswerId {get; set;}
        public int QuestionId {get; set;}
        public string AnswerText {get;set;}
    }
    

    所以你有问题和答案之间的关系。然后根据给出的答案检查您的答案:

    var userAnswers = new List(Answer);
    //populate your useranswers here
    
    foreach(var question in Questions)
    {
        var answersForQuestion = question.Answers.Select(a=>a.QuestionId == question.Id);
        if (userAnswers.FindAll(ua => ua.QuestionId == questionId).Length == question.Answers.Count())
        {
            //correct amount of answers. check for actual answers
            if (userAnswers.Any(ua => question.Answers.Contains(a=>a.Id == ua.Id))
        //correct answers made
        {
    }
    

    这假设问题的答案是固定的(即多项选择),如果他们输入了答案,这可能会更棘手

    【讨论】:

    • 感谢您的回复。这绝对是一个进步! :-) 虽然我的课看起来像这样,所以用户的答案在字符串列表中,你还能像这样用 linq 迭代它们吗?
    • 是的,您只需更改文本的 ID。由于字符串发生变化,您需要进行一些格式化和验证。
    【解决方案2】:

    您能否展示您的代码以获得更好的答案?

    我认为可能是这样的:

    int correctAnswersCount = yourlist.Count(answer => answer.Contais(UserAnswerText));
    

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 2023-04-10
      相关资源
      最近更新 更多