2014-06-20 4 views
1

Я пытаюсь сопоставить определенную скорость ветра (измеренную в метрах в секунду) с соответствующей меткой, взятой из http://www.windfinder.com/wind/windspeed.htm. Для этого я хотел бы использовать switch statements, однако я не уверен, как это сделать в C#.Использование оператора switch для диапазонов

В 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 различных диапазонов, я хотел бы получить более читаемым решение.

ответ

3

переключателя заявления по MSDN,

Каждая метка случае определяет постоянное значение. Переключатель управление заявлением передает в секцию переключателя, дело метка совпадает со значением выражения переключателя

Таким образом, вы не можете указать диапазон, а также при работе с двойниками, случай округления и незначительными неточностями будут делать точные совпадения плохой выбор в лучшем случае.

UPDATE: Если вы хотите читаемость, лучшее, что я могу предложить одиночные линии и, возможно, выравнивание руки

if(mps >= 0 && <= 0.2) return WindSpeedLabel.Calm; 
else if(mps <= 0.4) return WindSpeedLabel.Gusty; 
... 
else     return WindSpeeLabel.HurricaneForce5; 

Обратите внимание на приведенный выше код не использует минимальный диапазон после первого заявления - это предотвратить небольшое закругление ошибки, вызвавшие прохождение данной скорости ветра. Это связано с тем, что удваивание на уровне аппаратных уровней с использованием двоичных и occacialally имеет небольшую степень ошибки, в результате чего 0,2 входит во время выполнения, как 0.200000000000000001 или 0.1999999999999999, - хотя это редко, это может привести к поведению, полностью противоречащему нашему человекопонимающему понятию чисел , и делает двойное тестирование того, что мы могли бы подразумевать из предыдущего утверждения, немного рискованного.

Если вы абсолютно ДОЛЖНЫ иметь инструкцию Switch, вы можете отобразить скорость ветра в виде строки или вокруг нее.

switch((int)(mps * 10)) 
{ 
    case 0: 
    case 1: 
    case 2: 
     return WindSpeedLabel.Calm; 
     break; 
} 
+0

«Обратите внимание, что приведенный выше код не использует минимальный диапазон после первого утверждения»? Что ты хочешь этим сказать? Какие значения могут потерпеть неудачу? – Acrotygma

+0

Я обновлю ответ – David

Смежные вопросы