2016-11-10 59 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。由於字符串更改,您需要進行一些格式設置和驗證。 –