我正在尝试使用while循环进行检查,我希望循环仅在触发了三个条件之一的情况下才要求用户重新输入其值。也就是说,如果响应为空,也不是“ Y”或“ N”。我通过使用!操作员。我注意到,即使响应是正确的选择,while循环仍然要求重新输入一个值。我还注意到,当我删除!运算符从第二个条件的前面开始,并且用户在循环块工作之后输入正确的响应,但是当我添加!运算符返回到条件,即使响应正确也可以循环。
PromptMessage("If you are using a different download path for your mods enter (Y)es. Or if you want to exit out the" +
" program enter (N)o!", ConsoleColor.Green);
string CustomPath = Console.ReadLine();
CustomPath.ToUpper();
Console.WriteLine(CustomPath);
while (!CustomPath.Contains("Y") || !CustomPath.Contains("N") || String.IsNullOrEmpty(CustomPath))
{
AlertMessage("Please enter either Y to continue or N to exit");
CustomPath = Console.ReadLine();
CustomPath.ToUpper();
}
答案 0 :(得分:5)
您在这里有几处错误。首先,字符串在C#中是不可变的,因此请执行以下操作:
string foo = "some string";
foo.ToUpper();
表示foo
在运行后仍等于"some string"
。您需要将值分配到一个变量(它甚至可以是相同的变量)。像这样:
string foo = "some string";
foo = foo.ToUpper();
//foo = "SOME STRING"
下一个问题是循环和逻辑。我认为一种更简单的方法是使用do/while
循环并在while条件下检查输入的“有效性”。 do/while
循环意味着您将始终在检查while
条件之前先执行一次操作。您总是想一次请求输入,因此使用此循环更有意义:
public static void Main()
{
//defined in outer scope
string customPath = string.Empty;
do
{
Console.WriteLine("If you are using a different download path for your mods enter (Y)es. Or if you want to exit out the program enter (N)o!");
//Calling ToUpper() before assigning the value to customPath
customPath = Console.ReadLine().ToUpper();
}
while (customPath != "N" && customPath != "Y");
}
我做了一个小提琴here
答案 1 :(得分:2)
我认为您可能颠倒了逻辑。您是说要满足while
的条件,如下所述?
while (!CustomPath.Contains("Y") && !CustomPath.Contains("N") && !String.IsNullOrEmpty(CustomPath))
从逻辑上讲,这等效于以下语句(但此语句的IMO可读性低得多)
while (!(CustomPath.Contains("Y") || CustomPath.Contains("N") || String.IsNullOrEmpty(CustomPath))
这样,当输入的路径不包含“ Y”,“ N”或空路径时,循环将继续。
还要注意,正如@maccettura指出的那样,您将希望更改为使用CustomPath = CustomPath.ToUpper();
答案 2 :(得分:1)
更改为此
while ((!CustomPath.Contains("Y") && !CustomPath.Contains("N")) || String.IsNullOrEmpty(CustomPath))
我意识到您的代码将始终返回true。
例如,您输入“ Y”
!CustomPath.Contains("Y") => false
!CustomPath.Contains("N") => true
由于您使用||
,因此它将始终返回true。