switch语句的复杂多个案例

时间:2014-07-18 11:09:44

标签: 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");
}

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

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

2 个答案:

答案 0 :(得分: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;
}

modulo operator %将为您提供整数除法pos / 10的其余部分 - 即一个始终在[0, 9]范围内的整数。除了特殊情况11,12和13之外,这足以使其余代码几乎完成。

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

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

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

答案 1 :(得分:3)

使用模运算符(数字%10)。