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)
我宁愿不手动输入它,因为最终我将使用大型数组.
我想要么能够使用通配符(*)或逗号,但它不会让我.如果不手动输入每个数字,解决此问题的简单方法是什么?
简单地改变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来消除误传的可能性; 如果您愿意,可以选择其他号码.