2013-04-03 4 views
1

Я написал несколько if-то еще такие заявления:Перепишите, если еще в коммутаторе

if (workedDays > 0 && workedDays <= 180) 
    { 
    x= 14; 
    } 

    if (workedDays > 180 && workedDays <= 540) 
    { 
    x= 28; 
    } 

    if (workedDays > 540 && workedDays <= 1068) 
    { 
    x= 42; 
    } 
    else 
    { 
    x= 56; 
    } 

Я пытался переписать его как переключатель заявление, как это:

switch (workedDays) 
    { 
    case (workedDays > 0 && workedDays <= 180): 
     x=14; 
     break; 
    default: 
     break; 
    } 

Однако, Я получаю ошибку Cannot implicitly convert type 'bool' to 'int'.

Как это исправить?

+1

workingDays - это int, а выражения вашего переключателя оцениваются как bools, поэтому очевидно, что это не работает. Я думаю, что утверждения IF лучше и понятнее в этом случае, не используйте переключатель, если нет реальной выгоды. –

+2

Коммутатор может использовать только константы в C#. Не такие выражения, как VB.Net. Что не так с вашим if: s? – adrianm

+0

«Если» больше подходит в этой ситуации –

ответ

6

Хотя switch(true) ответ @Jeroen может работать, я предлагаю следующее за readablity:

if (workedDays <= 180) 
    x = 14; 
else if (workedDays <= 540) 
    x = 28; 
else if (workedDays <= 1068) 
    x = 42; 
else 
    x = 56; 

С else if конструкции, нет необходимости перепроверить как минимальные и максимальные значения.

+0

Я одобрил, но хотел бы указать, что вам не хватает случая, когда 'workDays <= 0' ... хотя кажется, что это может быть неверно в вопросе OPs? – paul

+0

@Williem Duncan. вы пытались написать его с целью удобочитаемости. Ничего плохого в моем случае не было. Просто хотел изучить этот путь. –

+0

@paul Я удалил это для удобочитаемости (и я также предположил, что может быть неправильно получить ' Когда 'workDays <0'), но он легко добавляется. –

0

сделать:

switch (true) 
    { 
     case (workedDays > 0 && workedDays <= 180): 
      x=14; 
      break; 
     default: 
      break; 
    } 
+3

Этого не должно быть сделано, чтобы включить true, не только не имеет смысла, но и выглядит неправильно. – Clint

+0

Не сказать, что это лучший способ, но это способ исправить ошибку :), вот что он спросил. – JMan

+1

Я никогда раньше не видел этого подхода и делал быстрый поиск по нему, а в некоторых случаях, включая читаемость, кажется, имеет смысл. http://stackoverflow.com/questions/2765981/javascript-switchtrue '« Да ... Я думаю, что вы слишком оскорбительны в этом вопросе, и я вижу компромисс между читабельностью в любом случае. Оператор switch дает мне визуальный сигнал что ни одно из следующих условий не будет оценено, где с рядом ifs я должен заметить возвращения, чтобы понять это.Я думаю, что switch (true) является хорошей и полезной идиомой и не должен быть отклонен, хотя это точное использование не является идеей «-связано – Scott

0

Если вы считаете, что вы просите компилятор вы поймете, почему у вас есть проблемы.

Вы переключение на workedDays который предположительно INT:

switch(workedDays:int) 
{ 
    case (workedDays > 0 && workedDays <= 180): 

    break; 
} 

Где вы получили ваше дело, которое вычисляется в истинный или ложный результат (логическое значение), так что вы просите его выбирать между целыми числами, но дать ему bool как возможность!

0

Вы не можете. Операторы switch могут использоваться только с константами времени компиляции. See this question

2

Ну, мне лично не нравится иметь так много if-else-if's.

Обычно я придерживаюсь идеи «три или более, используйте для!».

Итак, я хотел бы сделать это: -

class Program 
{ 
    struct Data 
    { 
    public Data (int l, int u, int v) 
    { 
     lower = l; 
     upper = u; 
     value = v; 
    } 
    public int lower; 
    public int upper; 
    public int value; 
    } 

    static void Main (string [] args) 
    { 
    Data [] 
     // at the moment, this is coded into the source 
     // it can be read from a file at run time instead 
     data = { new Data (0, 180, 14), new Data (180, 540, 28), new Data (540, 1068, 42) }; 

    int 
     // again, the default case is hard coded, it too can be loaded from a file 
     x = 56, 
     workedDays = 100; 

    foreach (Data item in data) 
    { 
     if (workedDays > item.lower && workedDays <= item.upper) 
     { 
     x = item.value; 
     break; 
     } 
    } 
    } 
} 

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

+0

Это превращает его в ужасный беспорядок, было бы гораздо более полезно с парами значений ключа и максимального значения, или если требуется минимум и максимум, сбор кортежей. –

+0

Что относительно читаемости? Это похоже на обфускацию кода. –

+0

@WillemDuncan: Хорошо, да, я ссылался на это в ответе, если вы читаете комментарии. Я был кратким и своего рода языковым агностиком (и коротким по времени). Не стесняйтесь заменять массив ints массивом структур. – Skizz

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