C# 我怎么能忽略一个';while循环';如果Console.ReadLine()与定义的输入匹配+;输入无效时仅循环一次
我告诉用户输入三种可能的颜色中的一种。如果用户错误地键入颜色(拼写等)-“while”功能应重复,直到他们键入“有效”颜色 “while”功能似乎只运行一次,然后不管用户键是什么,都会继续运行 它似乎也会先忽略用户键(即使正确),然后进入“while”功能。很明显,如果用户第一次选择正确,我希望它跳过“while”功能 *由于某些不正确(旧)代码仍在其中,因此编辑了该示例 下面的代码示例C# 我怎么能忽略一个';while循环';如果Console.ReadLine()与定义的输入匹配+;输入无效时仅循环一次,c#,string,while-loop,C#,String,While Loop,我告诉用户输入三种可能的颜色中的一种。如果用户错误地键入颜色(拼写等)-“while”功能应重复,直到他们键入“有效”颜色 “while”功能似乎只运行一次,然后不管用户键是什么,都会继续运行 它似乎也会先忽略用户键(即使正确),然后进入“while”功能。很明显,如果用户第一次选择正确,我希望它跳过“while”功能 *由于某些不正确(旧)代码仍在其中,因此编辑了该示例 下面的代码示例 Console.WriteLine("Select Colour (Red / Blue / Green):
Console.WriteLine("Select Colour (Red / Blue / Green): ");
string colSel = Console.ReadLine().ToLower();
while (colSel != "Red" || colSel != "Blue" || colSel != "Green")
{
Console.WriteLine("Sorry, I didn't catch that...");
Console.Write("Select Colour (Red / Blue / Green): ");
colSel = Console.ReadLine().ToLower();
break;
}
Console.WriteLine("Alright " + colSel + ", good. ");
循环只运行一次的原因(假设用户一直输入错误的输入)是因为循环末尾包含
break
break
是一个特殊的关键字,用于退出开关箱和回路
最重要的是,colSel
设置为用户输入的小写版本,但是while循环比较在字符串中使用大写,这意味着正确的用户输入将失败
尝试:
该代码存在一些问题: 1。
while
条件始终为true
while (colSel != "Red" || gClas != "Blue" || gClas != "Green")
(或运算符)的工作方式是,它对每个表达式求值,并在其中一个表达式求值为true
时立即返回true
。由于colSel
不能超过一个颜色字符串,因此条件将返回true
,而while
循环将继续
您要查找的运算符是(AND)运算符,只有当所有表达式都返回true
时,它才会返回true
,否则返回false
2。您正在对输入调用ToLower
,并将其与带有大写字符的字符串进行比较,因此,没有一个字符串与您的比较相匹配。使用小写字符串将是处理此问题的一种方法 3。循环中有一个
break
语句这意味着“立即退出循环”。它的对应项是
continue
,意思是“停止执行当前迭代并再次启动循环”。但是您不需要这两个,因为while
循环将自动继续,直到条件返回false
因此,要修复代码,您可以执行以下操作:
Console.Write("Select Colour (Red / Blue / Green): ");
string colSel = Console.ReadLine().ToLower();
while (colSel != "red" && colSel != "blue" && colSel != "green")
{
Console.WriteLine("Sorry, I didn't catch that...");
Console.Write("Select Colour (Red / Blue / Green): ");
colSel = Console.ReadLine().ToLower();
}
Console.WriteLine("Alright " + colSel + ", good. ");
此外,通过使用将输入与之进行比较的有效值数组(或列表),可以使代码更易于维护(并改进字符串比较)。这允许您动态显示有效值(使用数组上的
string.Join
)并动态验证输入(通过使用不区分大小写的比较器检查values.Contains
输入)。但在这一点上,它可能有点先进
要进行尝试,只需向数组中添加您想要的任何字符串,并注意提示符如何更改,验证如何自动处理新添加的内容:
// Add any valid values to this array
var validValues = new[] {"Red", "Blue", "Green"};
var prompt = $"Select Colour ({string.Join(" / ", validValues)}): ";
Console.Write(prompt);
string userInput = Console.ReadLine();
while (!validValues.Contains(userInput, StringComparer.OrdinalIgnoreCase))
{
Console.WriteLine($"Sorry, '{userInput}' is not a valid value.");
Console.Write(prompt);
userInput = Console.ReadLine();
}
Console.WriteLine("Alright " + userInput + ", good. ");
更好的方法是使用
哈希集
,并将三种颜色添加到其中。然后使用!hashsetName.Contains(colSel)
。那么您就不必担心|
与&
之间的关系。非常感谢您的全面回复。稍后我会看看你的建议,并尝试找出我错在哪里!非常感谢您的回复:)今天晚些时候我将尝试您的一些建议
// Add any valid values to this array
var validValues = new[] {"Red", "Blue", "Green"};
var prompt = $"Select Colour ({string.Join(" / ", validValues)}): ";
Console.Write(prompt);
string userInput = Console.ReadLine();
while (!validValues.Contains(userInput, StringComparer.OrdinalIgnoreCase))
{
Console.WriteLine($"Sorry, '{userInput}' is not a valid value.");
Console.Write(prompt);
userInput = Console.ReadLine();
}
Console.WriteLine("Alright " + userInput + ", good. ");