如何更改 goto 语句以改进代码?
How to change goto statement to improve code?
我正在编写 C# Windows 表单应用程序。我有一个带有随机词的标签,例如“计算机”。用户看到被覆盖的词,在这个例子中:“--------”。用户必须通过逐字母猜测来猜测这个词是什么。我创建了按钮提示。该按钮负责显示一个随机字母。那是我创建的代码:
private void btnHint_Click(object sender, EventArgs e)
{
repeat:
Random rnd = new Random();
int rand = rnd.Next(corrArr.Length);
char letter = corrArr[rand];
if (letters.Contains(letter.ToString())) //check if the random letter is already used
{
goto repeat;
}
else
{
word.Text = "";
var idx = correct.IndexOf(letter);
wordArr[idx] = Convert.ToChar(letter);
foreach (var item in wordArr)
{
word.Text += item.ToString();
}
count++;
if (wordLen == count)
{
this.BackColor = Color.LimeGreen;
result.Text = "Win!!";
tb.Enabled = false;
btnClick.Visible = false;
}
}
letters.Add(letter.ToString());
}
通过goto
声明我可以再画一个字母,如果之前的字母已经被使用了。
我听说我不应该像在代码开头那样使用 goto
语句,但程序运行完美。我如何改进代码?
当你的随机字母仍然包含在已经使用的字母中时,绕着你检查并重复它。
private void btnHint_Click(object sender, EventArgs e) {
Random rnd = new Random();
char letter;
while (letters.Contains((letter = corrArr[rnd.Next(corrArr.Length)]).ToString()))
; //the loops body is left empty intentionally
...
}
更好的方法是,收集可用字母,每次 select 随机将其从可用字母集合中删除。这样,您就不必进行任何检查或循环
var availLetters = "abcdef....";
int rand = rnd.Next(availLetters.Length);
char letter = availLetters[rand];
availLetters = availLetters.Substring(0, rand) + availLetters.Substring(rand+1);
...
保留 if/else 语句并使用 Do While 循环
Random rnd = new Random();
char letter;
do
{
int rand = rnd.Next(corrArr.Length);
letter = corrArr[rand];
} while (letters.Contains(letter.ToString()));
word.Text = "";
var idx = correct.IndexOf(letter);
wordArr[idx] = Convert.ToChar(letter);
当然还有更多需要改进的地方……;)
我正在编写 C# Windows 表单应用程序。我有一个带有随机词的标签,例如“计算机”。用户看到被覆盖的词,在这个例子中:“--------”。用户必须通过逐字母猜测来猜测这个词是什么。我创建了按钮提示。该按钮负责显示一个随机字母。那是我创建的代码:
private void btnHint_Click(object sender, EventArgs e)
{
repeat:
Random rnd = new Random();
int rand = rnd.Next(corrArr.Length);
char letter = corrArr[rand];
if (letters.Contains(letter.ToString())) //check if the random letter is already used
{
goto repeat;
}
else
{
word.Text = "";
var idx = correct.IndexOf(letter);
wordArr[idx] = Convert.ToChar(letter);
foreach (var item in wordArr)
{
word.Text += item.ToString();
}
count++;
if (wordLen == count)
{
this.BackColor = Color.LimeGreen;
result.Text = "Win!!";
tb.Enabled = false;
btnClick.Visible = false;
}
}
letters.Add(letter.ToString());
}
通过goto
声明我可以再画一个字母,如果之前的字母已经被使用了。
我听说我不应该像在代码开头那样使用 goto
语句,但程序运行完美。我如何改进代码?
当你的随机字母仍然包含在已经使用的字母中时,绕着你检查并重复它。
private void btnHint_Click(object sender, EventArgs e) {
Random rnd = new Random();
char letter;
while (letters.Contains((letter = corrArr[rnd.Next(corrArr.Length)]).ToString()))
; //the loops body is left empty intentionally
...
}
更好的方法是,收集可用字母,每次 select 随机将其从可用字母集合中删除。这样,您就不必进行任何检查或循环
var availLetters = "abcdef....";
int rand = rnd.Next(availLetters.Length);
char letter = availLetters[rand];
availLetters = availLetters.Substring(0, rand) + availLetters.Substring(rand+1);
...
保留 if/else 语句并使用 Do While 循环
Random rnd = new Random();
char letter;
do
{
int rand = rnd.Next(corrArr.Length);
letter = corrArr[rand];
} while (letters.Contains(letter.ToString()));
word.Text = "";
var idx = correct.IndexOf(letter);
wordArr[idx] = Convert.ToChar(letter);
当然还有更多需要改进的地方……;)