在 C# 中删除代码重复
Removing code duplication in C#
我有很多 if 和 else 语句,我想知道如何才能让它变得简短而有趣。此函数检查用户输入到文本框中的答案是否与(隐藏的)数据网格中的答案相同。如果相同,则将 1 添加到 correctAnswer - 计算用户正确答案的数量(反之亦然,错误答案)
bool firstAnswerCorrect = CheckAnswer(dataGridView1.Rows[0], textBoxQ1);
if (firstAnswerCorrect == true)
{
label1.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label1.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool secondAnswerCorrect = CheckAnswer(dataGridView1.Rows[1], textBoxQ2);
if (firstAnswerCorrect == true)
{
label2.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label2.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool thirdAnswerCorrect = CheckAnswer(dataGridView1.Rows[2], textBoxQ3);
if (thirdAnswerCorrect == true)
{
label3.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label3.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool fourthAnswerCorrect = CheckAnswer(dataGridView1.Rows[3], textBoxQ4);
if (fourthAnswerCorrect == true)
{
label4.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label4.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool fifthAnswerCorrect = CheckAnswer(dataGridView1.Rows[4], textBoxQ5);
if (fifthAnswerCorrect == true)
{
label5.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label5.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool sixthAnswerCorrect = CheckAnswer(dataGridView1.Rows[5], textBoxQ6);
if (sixthAnswerCorrect == true)
{
label6.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label6.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool seventhAnswerCorrect = CheckAnswer(dataGridView1.Rows[6], textBoxQ7);
if (seventhAnswerCorrect == true)
{
label7.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label7.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool eighthAnswerCorrect = CheckAnswer(dataGridView1.Rows[7], textBoxQ8);
if (eighthAnswerCorrect == true)
{
label8.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label8.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool ninethAnswerCorrect = CheckAnswer(dataGridView1.Rows[8], textBoxQ9);
if (ninethAnswerCorrect == true)
{
label9.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label9.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool tenthAnswerCorrect = CheckAnswer(dataGridView1.Rows[9], textBoxQ10);
if (tenthAnswerCorrect == true)
{
label10.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label10.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
label11.Text = ("YOU HAVE SCORED " + correctAnswers + " OUT OF 10");
label12.Text = ("YOU HAVE " + wrongAnswers + " QUESTIONS WRONG");
代码工作只是重复
编辑:
这个函数只是计算正确和错误的答案。我有另一个功能,它检查用户输入到文本框中的答案是否与(隐藏)数据网格中的答案相同
这是该函数的代码:
private bool CheckAnswer(DataGridViewRow dataGridViewRow, TextBox textBox)
{
string correctAnswer = dataGridViewRow.Cells["answer"].Value.ToString();
string givenAnswer = textBox.Text;
bool isCorrect = string.Equals(correctAnswer, givenAnswer, StringComparison.CurrentCultureIgnoreCase);
return isCorrect;
}
正如我所说。它在工作,但只是重复,这不是一个好兆头。
编辑:
这是我正在使用的新 C# 代码,它消除了代码重复,但是当我稍微调整它时遇到了异常。
List<TextBox> textboxes = new List<TextBox> { textBoxQ1, textBoxQ2, textBoxQ3, textBoxQ4, textBoxQ5, textBoxQ6, textBoxQ7, textBoxQ8, textBoxQ9, textBoxQ10 };
List<Label> labels = new List<Label> { label1, label2, label3, label4, label5, label6, label7, label8, label9, label10 };
bool temp;
for (int i = 0; i < 10; i++)
{
temp = CheckAnswer(dataGridView1.Rows[i], textboxes[i]);
if (temp == true)
{
labels[i].Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
labels[i].Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
label11.Text = ("YOU HAVE SCORED " + correctAnswers);
label12.Text = ("YOU HAVE SCORED " + correctAnswers);
}
An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll
Additional information: Index was out of range. Must be non-negative and less than the size of the collection.
行:
temp = CheckAnswer(dataGridView1.Rows[i], textboxes[i]);
我会将所有答案文本框和 correct/incorrect 答案标签存储在一个数组中,例如 Label[] answerLabels
和 TextBox[] answerTextBoxes
。这些数组应正确排序,即 answerLabels[0]
和 answerTextBoxes[0]
应对应第一个问题,answerLabels[1]
和 answerTextBoxes[1]
应对应第二个问题,依此类推。
此后这变成了一个 for 循环:
for(int i = 0; i < answerLabels.Length; i++) {
bool answerCorrect = CheckAnswer(dataGridView1.Rows[i], answerTextBoxes[i]);
if (answerCorrect == true)
{
answerLabels[i].Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
answerLabels[i].Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
}
您可以制作一个 List<TextBox>
和另一个 List<Label>
,如下所示:
List<TextBox> textboxes = new List<TextBox>{textbox1, ....}
List<Label> labels = new List<Label>{label1, label2, ....}
bool temp;
for(int i = 0; i < 10; i++)
{
temp = CheckAnswer(dataGridView1.Rows[i], textBoxes[i]);
if (temp)
{
labels[i].Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
labels[i].Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
}
可以尝试通过以下方式减少重复:
List<TextBox> textBoxList = new List<TextBox>() {
textBoxQ1,
textBoxQ2,
...
textBoxQN
};
List<Label> labelList = new List<Label>() {
label1,
label2,
...
labelN
};
for(int i = 0; i < textBoxList.Count; i++) {
bool answerCorrect = CheckAnswer(dataGridView1.Rows[i], textBoxList[i]);
labelList[i].Text = answerCorrect ? "correct" : "incorrect";
correctAnswers += answerCorrect ? 1 : 0;
wrongAnswers += !answerCorrect ? 1 : 0;
}
一个简单的解决方案是将所有内容更改为字符串而不是布尔值。这样您就不需要任何 if
语句。只是 label1.Text = firstAnswerCorrect
等于(字符串)"correct"
或 "incorrect"
对于函数,您只需 return "correct"
或 "incorrect"
希望这对您有所帮助。
我有很多 if 和 else 语句,我想知道如何才能让它变得简短而有趣。此函数检查用户输入到文本框中的答案是否与(隐藏的)数据网格中的答案相同。如果相同,则将 1 添加到 correctAnswer - 计算用户正确答案的数量(反之亦然,错误答案)
bool firstAnswerCorrect = CheckAnswer(dataGridView1.Rows[0], textBoxQ1);
if (firstAnswerCorrect == true)
{
label1.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label1.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool secondAnswerCorrect = CheckAnswer(dataGridView1.Rows[1], textBoxQ2);
if (firstAnswerCorrect == true)
{
label2.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label2.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool thirdAnswerCorrect = CheckAnswer(dataGridView1.Rows[2], textBoxQ3);
if (thirdAnswerCorrect == true)
{
label3.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label3.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool fourthAnswerCorrect = CheckAnswer(dataGridView1.Rows[3], textBoxQ4);
if (fourthAnswerCorrect == true)
{
label4.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label4.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool fifthAnswerCorrect = CheckAnswer(dataGridView1.Rows[4], textBoxQ5);
if (fifthAnswerCorrect == true)
{
label5.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label5.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool sixthAnswerCorrect = CheckAnswer(dataGridView1.Rows[5], textBoxQ6);
if (sixthAnswerCorrect == true)
{
label6.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label6.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool seventhAnswerCorrect = CheckAnswer(dataGridView1.Rows[6], textBoxQ7);
if (seventhAnswerCorrect == true)
{
label7.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label7.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool eighthAnswerCorrect = CheckAnswer(dataGridView1.Rows[7], textBoxQ8);
if (eighthAnswerCorrect == true)
{
label8.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label8.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool ninethAnswerCorrect = CheckAnswer(dataGridView1.Rows[8], textBoxQ9);
if (ninethAnswerCorrect == true)
{
label9.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label9.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
bool tenthAnswerCorrect = CheckAnswer(dataGridView1.Rows[9], textBoxQ10);
if (tenthAnswerCorrect == true)
{
label10.Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
label10.Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
label11.Text = ("YOU HAVE SCORED " + correctAnswers + " OUT OF 10");
label12.Text = ("YOU HAVE " + wrongAnswers + " QUESTIONS WRONG");
代码工作只是重复
编辑:
这个函数只是计算正确和错误的答案。我有另一个功能,它检查用户输入到文本框中的答案是否与(隐藏)数据网格中的答案相同
这是该函数的代码:
private bool CheckAnswer(DataGridViewRow dataGridViewRow, TextBox textBox)
{
string correctAnswer = dataGridViewRow.Cells["answer"].Value.ToString();
string givenAnswer = textBox.Text;
bool isCorrect = string.Equals(correctAnswer, givenAnswer, StringComparison.CurrentCultureIgnoreCase);
return isCorrect;
}
正如我所说。它在工作,但只是重复,这不是一个好兆头。
编辑:
这是我正在使用的新 C# 代码,它消除了代码重复,但是当我稍微调整它时遇到了异常。
List<TextBox> textboxes = new List<TextBox> { textBoxQ1, textBoxQ2, textBoxQ3, textBoxQ4, textBoxQ5, textBoxQ6, textBoxQ7, textBoxQ8, textBoxQ9, textBoxQ10 };
List<Label> labels = new List<Label> { label1, label2, label3, label4, label5, label6, label7, label8, label9, label10 };
bool temp;
for (int i = 0; i < 10; i++)
{
temp = CheckAnswer(dataGridView1.Rows[i], textboxes[i]);
if (temp == true)
{
labels[i].Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
labels[i].Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
label11.Text = ("YOU HAVE SCORED " + correctAnswers);
label12.Text = ("YOU HAVE SCORED " + correctAnswers);
}
An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll
Additional information: Index was out of range. Must be non-negative and less than the size of the collection.
行:
temp = CheckAnswer(dataGridView1.Rows[i], textboxes[i]);
我会将所有答案文本框和 correct/incorrect 答案标签存储在一个数组中,例如 Label[] answerLabels
和 TextBox[] answerTextBoxes
。这些数组应正确排序,即 answerLabels[0]
和 answerTextBoxes[0]
应对应第一个问题,answerLabels[1]
和 answerTextBoxes[1]
应对应第二个问题,依此类推。
此后这变成了一个 for 循环:
for(int i = 0; i < answerLabels.Length; i++) {
bool answerCorrect = CheckAnswer(dataGridView1.Rows[i], answerTextBoxes[i]);
if (answerCorrect == true)
{
answerLabels[i].Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
answerLabels[i].Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
}
您可以制作一个 List<TextBox>
和另一个 List<Label>
,如下所示:
List<TextBox> textboxes = new List<TextBox>{textbox1, ....}
List<Label> labels = new List<Label>{label1, label2, ....}
bool temp;
for(int i = 0; i < 10; i++)
{
temp = CheckAnswer(dataGridView1.Rows[i], textBoxes[i]);
if (temp)
{
labels[i].Text = "correct";
correctAnswers = correctAnswers + 1;
}
else
{
labels[i].Text = "incorrect";
wrongAnswers = wrongAnswers + 1;
}
}
可以尝试通过以下方式减少重复:
List<TextBox> textBoxList = new List<TextBox>() {
textBoxQ1,
textBoxQ2,
...
textBoxQN
};
List<Label> labelList = new List<Label>() {
label1,
label2,
...
labelN
};
for(int i = 0; i < textBoxList.Count; i++) {
bool answerCorrect = CheckAnswer(dataGridView1.Rows[i], textBoxList[i]);
labelList[i].Text = answerCorrect ? "correct" : "incorrect";
correctAnswers += answerCorrect ? 1 : 0;
wrongAnswers += !answerCorrect ? 1 : 0;
}
一个简单的解决方案是将所有内容更改为字符串而不是布尔值。这样您就不需要任何 if
语句。只是 label1.Text = firstAnswerCorrect
等于(字符串)"correct"
或 "incorrect"
对于函数,您只需 return "correct"
或 "incorrect"
希望这对您有所帮助。