Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 允许用户仅输入字符串作为答案_C#_Asp.net_.net - Fatal编程技术网

C# 允许用户仅输入字符串作为答案

C# 允许用户仅输入字符串作为答案,c#,asp.net,.net,C#,Asp.net,.net,我想让一个用户只被允许输入字母,这是我到目前为止尝试过的,但是当用户输入一个数字或其他任何东西时,控制台应用程序就会继续 static public string Ask(string question) { do { Console.Write(question); return Console.ReadLine(); } while (Regex.IsMatch(Console.Rea

我想让一个用户只被允许输入字母,这是我到目前为止尝试过的,但是当用户输入一个数字或其他任何东西时,控制台应用程序就会继续

 static public string Ask(string question)
    {
        do
        {
            Console.Write(question);
            return Console.ReadLine();

        } while (Regex.IsMatch(Console.ReadLine(), @"^[a-zA-Z]+$"));

    }

提前感谢。

问题是您返回的是第一个
控制台.ReadLine()
的结果,因此您的循环不会继续到
while
子句

您需要做的是创建一个字符串变量并赋值,然后在while子句中检查它:

public static string Ask(string question)
{
    string input;
    do
    {
        Console.Write(question);

        //Assigns the user input to the 'input' variable
        input = Console.ReadLine();

    } //Checks if any character is NOT a letter 
    while (input.Any(x => !char.IsLetter(x)));

    //If we are here then 'input' has to be all letters
    return input;
}
注意,我还使用Linq的
Any()
代替了Regex。对我来说似乎更容易,而且可能更快(太懒了,无法进行基准测试)


Fiddle

问题是您正在返回第一个
Console.ReadLine()
的结果,因此您的循环永远不会继续到
while
子句

您需要做的是创建一个字符串变量并赋值,然后在while子句中检查它:

public static string Ask(string question)
{
    string input;
    do
    {
        Console.Write(question);

        //Assigns the user input to the 'input' variable
        input = Console.ReadLine();

    } //Checks if any character is NOT a letter 
    while (input.Any(x => !char.IsLetter(x)));

    //If we are here then 'input' has to be all letters
    return input;
}
注意,我还使用Linq的
Any()
代替了Regex。对我来说似乎更容易,而且可能更快(太懒了,无法进行基准测试)


Fiddle

你不应该回到循环中。创建一个
字符串输入
变量并在循环中分配该变量,然后当循环退出时返回
输入
变量。如果在循环中返回,则不应在循环内返回。创建一个
字符串输入
变量,并在循环中分配该变量,然后当循环退出时返回
输入
变量。你在循环中的返回哇,刚才Any()让我大吃一惊,我不知道有这么简单的解决方案。多谢各位。我还添加了Console.WriteLine(“只允许使用字母”);只是为了让用户更清楚。非常感谢。@Robertme开始看看Linq,它是C#/(英语)中的一个游戏改变者。你能给我推荐一些教程或网站吗?我真的很想学习C#:)@Robertme文档,这是一个很好的开始。@Robertme
x=>
部分是一个很好的开始。基本上是一个“匿名函数”。本质上,这个表达式就像在问:如果
input
x=>
)中的任何字符不是字母(
!char.isleter(x)
)。哇,刚才any()让我大吃一惊,我不知道有这么简单的解决方案。多谢各位。我还添加了Console.WriteLine(“只允许使用字母”);只是为了让用户更清楚。非常感谢。@Robertme开始看看Linq,它是C#/(英语)中的一个游戏改变者。你能给我推荐一些教程或网站吗?我真的很想学习C#:)@Robertme文档,这是一个很好的开始。@Robertme
x=>
部分是一个很好的开始。基本上是一个“匿名函数”。本质上,这个表达式类似于询问:
input
x=>
)中的任何字符是否不是字母(
!char.isleter(x)
)。