我试图将某个风速(以米/秒为单位)映射到适当的标签,取自http://www.windfinder.com/wind/windspeed.htm。为此,我想使用switch statements
,但我不确定如何在C#
中执行此操作。
在ActionScript
中,可以使用切换块,我也在Clang
中看到了它。
// ActionScript 3
switch(true) {
case: mps >= 0 && <= 0.2
return WindSpeedLabel.Calm; break;
...
case else:
WindSpeedLabel.ShitHittingTheFan;
}
// Clang
switch(mps) {
case 0 ... 0.2:
return WindSpeedLabel.Calm;
...
我知道可以使用if/else statements
,但是对于大约13个不同的范围,我会很感激一个更易读的解决方案。
答案 0 :(得分:3)
根据MSDN,
切换语句每个案例标签指定一个常量值。 switch语句将控制权转移到switch的部分,其case标签与switch表达式的值匹配
因此,您无法指定范围,并且在使用双打时,舍入和轻微不准确的情况将使精确匹配最好是一个不好的选择。
更新:如果你想要可读性,我能提供的最好的是单行和可能的手对齐
if(mps >= 0 && <= 0.2) return WindSpeedLabel.Calm;
else if(mps <= 0.4) return WindSpeedLabel.Gusty;
...
else return WindSpeeLabel.HurricaneForce5;
注意上面的代码在第一个语句后没有使用最小范围 - 这可以防止轻微的舍入错误导致给定的风速降低。这是因为使用二进制和occaisionally硬件级别存储的双精度具有较小程度的错误,导致0.2进入运行时为0.200000000000000001或0.1999999999999999 - 虽然很少,但这可能导致行为与我们人类感知的数字概念完全不一致,并且在前面的陈述中对我们可能暗示的一些双重测试有点风险。
如果你绝对必须有一个Switch语句,你可以将你的风速渲染为一个字符串或将它围绕它。
switch((int)(mps * 10))
{
case 0:
case 1:
case 2:
return WindSpeedLabel.Calm;
break;
}