C# 我怎么能忽略一个';while循环';如果Console.ReadLine()与定义的输入匹配+;输入无效时仅循环一次

C# 我怎么能忽略一个';while循环';如果Console.ReadLine()与定义的输入匹配+;输入无效时仅循环一次,c#,string,while-loop,C#,String,While Loop,我告诉用户输入三种可能的颜色中的一种。如果用户错误地键入颜色(拼写等)-“while”功能应重复,直到他们键入“有效”颜色 “while”功能似乎只运行一次,然后不管用户键是什么,都会继续运行 它似乎也会先忽略用户键(即使正确),然后进入“while”功能。很明显,如果用户第一次选择正确,我希望它跳过“while”功能 *由于某些不正确(旧)代码仍在其中,因此编辑了该示例 下面的代码示例 Console.WriteLine("Select Colour (Red / Blue / Green):

我告诉用户输入三种可能的颜色中的一种。如果用户错误地键入颜色(拼写等)-“while”功能应重复,直到他们键入“有效”颜色

“while”功能似乎只运行一次,然后不管用户键是什么,都会继续运行

它似乎也会先忽略用户键(即使正确),然后进入“while”功能。很明显,如果用户第一次选择正确,我希望它跳过“while”功能

*由于某些不正确(旧)代码仍在其中,因此编辑了该示例 下面的代码示例

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. ");