switch语句的复杂多个案例

The*_*man 0 c# arrays switch-statement

在我的程序中,我要求用户输入数组的大小,然后用用户输入的数字填充数组.

然后用户输入一个数字,该数字将检查它是否存在于数组中.如果是,它将向控制台输出一条消息.

我希望能够根据数组中数字的位置打印不同的消息.

如果是第1日,第21日,第31日等,则会打印出不同的信息

如果它是第2,第22,第32等......将打印不同的信息

如果它是第3个,第23个,第33个等......将打印不同的消息

然后默认情况是如果它是"th"数字之一,将打印不同的消息

这是我的代码的一部分,它只适用于前10个数字.我遇到的问题是,11日,12日,13日不遵循正常规则,任何以11,12或13结尾的数字都是如此.

Console.Write("Now enter a number to compare: ");
int c = Convert.ToInt32(Console.ReadLine());
int pos = Array.IndexOf(arr, c);

if (pos > -1)
{
    switch (pos)
    {
        case 0:
            Console.WriteLine("{0} is the {1}st number in this list", c, pos + 1);
            break;

        case 1:
            Console.WriteLine("{0} is the {1}nd number in this list", c, pos + 1);
            break;

        case 2:
            Console.WriteLine("{0} is the {1}rd number in this list", c, pos + 1);
            break;

        default:
            Console.WriteLine("{0} is the {1}th number in this list", c, pos + 1);
            break;
    }

}
else
{
    Console.WriteLine("Sorry this number does not appear in the array");
}
Run Code Online (Sandbox Code Playgroud)

我宁愿不手动输入它,因为最终我将使用大型数组.

我想要么能够使用通配符(*)或逗号,但它不会让我.如果不手动输入每个数字,解决此问题的简单方法是什么?

Jon*_*Jon 6

简单地改变switch (pos)switch(pos % 10)调整你的switch语句:

switch (pos % 10)
{
    case 1:
        Console.WriteLine("{0} is the {1}st number in this list", c, pos);
        break;

    case 2:
        Console.WriteLine("{0} is the {1}nd number in this list", c, pos);
        break;

    case 3:
        Console.WriteLine("{0} is the {1}rd number in this list", c, pos);
        break;

    default:
        Console.WriteLine("{0} is the {1}th number in this list", c, pos);
        break;
}
Run Code Online (Sandbox Code Playgroud)

模运算 %会给你的整数除法的余pos / 10总也就是整数的范围- [0, 9].除了特殊情况11,12和13之外,这足以使其余代码几乎完成.

要在不弄乱switch案例本身的情况下处理这些案例,您可以将解决方案扩展到

var position = (pos == 11 || pos == 12 || pos == 13) ? 999 : pos % 10;
switch (position)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

上面的数字999是需要落入完全任意选择default的情况下switch.我在这里使用了999来消除误传的可能性; 如果您愿意,可以选择其他号码.