C#中的Switch语句对大小写敏感问题

10

我正在使用 switch 语句,并想知道如何忽略输入值的大小写。

这是我的代码:

using System;

namespace SwitchStatements
{
class MainClass
{
    public static void Main(string[] args)
    {
    Start:
        Console.WriteLine("Please Input the Grade");
        char grade = Convert.ToChar(Console.ReadLine());

        switch (grade)
        {
            case 'A':
                Console.WriteLine("Excellent Work!");
                break;
            case 'B':
                Console.WriteLine("Very Good Effort! Just a couple of     Errors =)");
                break;
            case 'C':
                Console.WriteLine("You Passed. Push Yourself Next Time");
                break;
            case 'D':
                Console.WriteLine("Better put in more effort next time. I know you can do better");
                break;
            default:
                Console.WriteLine("Invalid Grade.");
                break;
        }
        Console.ReadKey();
        goto Start;
    }
}
}

如果我输入'a'而不是'A',它会返回默认响应。

我可以使用某种比较吗?如果可以,在哪里放置?

8个回答

9
您可以将ConsoleKey用作switch条件,代码如下所示。
var grade =Console.ReadKey().Key;
switch (grade)
{
    case ConsoleKey.A:
        Console.WriteLine("Excellent Work!");
        break;
    case ConsoleKey.B:
        // Something here
        break;    
    case ConsoleKey.C:
        // Something here
        break;

    case ConsoleKey.D:
        // Something here
        break;          
    case ConsoleKey.E:
       // Something here
        break;             
    default:
       // Something here
        break;
}

为了避免将输入转换为大写/小写,然后再进行另一次字符转换。只需在 switch 内使用 ConsoleKey 枚举即可。


6
你可以使用 ToUpper(); 方法。
Convert.ToChar(Console.ReadLine().ToUpper());

为了避免使用Console.ReadLine()时出现获取更多字符的错误,您可以使用以下方法:

char grd = Convert.ToChar(Console.ReadKey().KeyChar.ToString().ToUpper());

@MohitShrivastava:感谢您对强制用户接受部分答案的评论,恕我这里补充几点,Console.ReadLine()允许用户输入多个字符,在这种情况下,Convert.ToChar()会给您带来错误 :)。 - sujith karivelil
1
@MohitShrivastava 1) Switch块完全可以将string值作为条件,因此无需转换回char; 2)KeyChar的值本身就是一个char,因此将其转换为string是不必要的,因为您可以使用char.ToUpper; 3)通常不需要使用char,因为您可以使用ConsoleKeyInfo.Key,它是一个枚举值,因此可以轻松地用作开关条件,而不必担心字符大小写。 - Abion47

2

1

1
在 switch 之前将其转换为大写,如下所示:
grade = Char.ToUpper(grade);

1

将 Switch 写成类似于 grade.ToUpper() 的形式,并且不要改变它的值,也许在之后你会需要它。

    char grade = Convert.ToChar(Console.ReadLine());

    switch (grade.ToUpper())
    {
        case 'A':
            Console.WriteLine("Excellent Work!");
            break;
        case 'B':
            Console.WriteLine("Very Good Effort! Just a couple of     Errors =)");
            break;
        case 'C':
            Console.WriteLine("You Passed. Push Yourself Next Time");
            break;
        case 'D':
            Console.WriteLine("Better put in more effort next time. I know you can do better");
            break;
        default:
            Console.WriteLine("Invalid Grade.");
            break;
    }

@S.Petrosov :尊重地提醒一下,在此补充几点,Console.ReadLine()允许用户输入多个字符,在这种情况下,Convert.ToChar()会导致错误:)。 - sujith karivelil
你会推荐使用什么替代品吗? - Marcus Bristow
@MarcusBristow 如果你只想读取一个字符,那么你应该使用Convert.ToChar(Console.Read())而不是Console.ReadLine()。 - Samvel Petrosov

1

你可能会像这样从一个情况跌到另一个情况

public static void Main(string[] args)
{
    Boolean validInputRead = false;
    Char grade;

    while(!validInputRead) 
    {
        validInputRead = true;

        Console.WriteLine("Please Input the Grade");
        grade = Convert.ToChar(Console.Read());

        switch (grade)
        {
            case 'A':
            case 'a':
                Console.WriteLine("Excellent Work!");
                break;

            case 'B':
            case 'b':
                Console.WriteLine("Very Good Effort! Just a couple of     Errors =)");
                break;

            case 'C':
            case 'c':
                Console.WriteLine("You Passed. Push Yourself Next Time");
                break;

            case 'D':
            case 'd':
                Console.WriteLine("Better put in more effort next time. I know you can do better");
                break;

            default:
                Console.WriteLine("Invalid Grade.");
                validInputRead = false;
                break;
        }

        Console.ReadKey();
    }
}

编辑

  • 根据建议,将代码从Console.ReadLine()更改为Console.Read()
  • 按要求添加了while(!validInputRead)

这将涉及大量无用的重复...最好将输入转换为大写,然后再处理它。 - nmg49
当控制台提示“请输入成绩”时,如果我输入“A+”,会发生什么? - sujith karivelil
抛出一个 System.FormatException - Benj
你能给我一个 while(true) 包装的例子吗?这样做会阻止程序在输入值后退出吗? - Marcus Bristow
@JeppeStigNielsen 同意。这一切都关乎范式 :-) - Benj
显示剩余4条评论

0

字符串 letterGrade; 整数 grade = 0;

        // This will hold the final letter grade
        Console.Write("Input the grade :");

        switch (grade)
        {

            case 1:
                // 90-100 is an A
                letterGrade = "A";
                Console.WriteLine("grade b/n 90-100");
                break;
            case 2:
                // 80-89 is a B
                letterGrade = "B";
                Console.WriteLine("grade b/n 80-89");
                break;
            case 3:
                // 70-79 is a C
                letterGrade = "C";
                Console.WriteLine("grade b/n 70-79");
                break;
            case 4:
                // 60-69 is a D
                letterGrade = "D";
                Console.WriteLine(" grade b/n 60-69 ");
                break;
            default:
                // point whic is less than 59
                Console.WriteLine("Invalid grade");

                break;
        }

这有什么帮助吗?它不能像原始代码那样工作。 - Gabriel Luci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接