2016-11-10 58 views
0

我试图创建一个评分测验的方法。如果测验问题只有一个正确的答案,它会正常工作,但我很难处理多个正确的答案。在列表中循环并匹配几个条件

我先检查一下当前问题有多少正确答案。如果它超过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++; 

回答

0

你能告诉你的代码,一个更好的答案?

我认为这可能是这样的:

int correctAnswersCount = yourlist.Count(answer => answer.Contais(UserAnswerText)); 
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 
    { 
} 

这是假设的提问固定答案(即多选),如果他们在答复中键入它可能会更棘手

+0

谢谢您的回复。这绝对是一步! :-) 尽管我的类看起来像这样,所以用户的答案是在一个字符串列表中,你仍然可以用linq迭代它们吗? –

+0

是的,你可以改变文本的ID。由于字符串更改,您需要进行一些格式设置和验证。 –