对范围使用switch语句

时间:2014-06-20 21:13:43

标签: c# .net mapping switch-statement

我试图将某个风速(以米/秒为单位)映射到适当的标签,取自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个不同的范围,我会很感激一个更易读的解决方案。

1 个答案:

答案 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;
}