Я предполагаю, что количество вопросов к вам в лучшем случае составляет 100 с, а не 1000000 + с. Таким образом, вместо того, чтобы обращаться к базе данных каждый раз, когда вы получаете ответ, вы должны взять весь идентификатор вопроса и его правильный ответ в самом начале и сохранить его в dictionary
. Затем проверьте правильность словаря и обновите оценку.
Ниже приведено грубое руководство, это не совсем рабочий код, но это должно дать вам достаточно хорошую идею, надеюсь, еще спросите в комментарии.
Таким образом, в вашем constructor
вы можете позвонить, чтобы получить все ответы. Как ниже:
private Dictionary<string, string> _correctAnswerLookup;
public Form1()
{
InitializeComponent();
_correctAnswerLookup = GetCorrectAnswerByQuestionLookup();
}
private Dictionary<string, string> GetCorrectAnswerByQuestionLookup()
{
Dictionary<string, string> correctAnswerLookup = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("select QuestionId, Answer from Questions", connection);
try
{
connection.Open();
var reader = cmd.ExecuteReader();
while (reader.Read())
{
string questionId = (string)reader["QuestionId"];
string answer = (string)reader["Answer"];
if (!correctAnswerLookup.ContainsKey(questionId))
{
correctAnswerLookup.Add(questionId, answer);
}
}
}
catch (Exception e)
{
// your exception handling
}
}
return correctAnswerLookup;
}
А в ответ на полученное событие вы можете просто проверить поиск и обновить счет. Обращайтесь с тонкостями о проверке и проверке нуля и т. Д.
private void OnAnswerSubmitted()
{
string currentQuestionId = ""; // however you get this in your UI.
string selectedAnswer = "";
if (_correctAnswerLookup[currentQuestionId] == selectedAnswer)
{
scoreCounter++;
}
lblScoreCounter.Text = scoreCounter.ToString();
}