Есть ли элегантный способ заменить что-то вроде переключателя при работе с интервалами? - PullRequest
5 голосов
/ 18 марта 2011

Есть ли в .NET способ заменить код, в котором интервалы сравниваются, например

if (compare < 10)
        {
            // Do one thing
        }
        else if (10 <= compare && compare < 20)
        {
            // Do another thing
        }
        else if (20 <= compare && compare < 30)
        {
            // Do yet another thing
        }
        else
        {
            // Do nothing
        }

, чем-то более элегантным, например, оператором switch (я думаю, что в Javascript "case (<10)" работает,а в с #)?Кто-нибудь еще находит этот код уродливым? </p>

Ответы [ 2 ]

4 голосов
/ 18 марта 2011

Одно упрощение: поскольку все они else-if вместо просто , если , вам не нужно проверять отрицание предыдущих условий. Т.е., это эквивалентно вашему коду:

if (compare < 10)
{
    // Do one thing
}
else if (compare < 20)
{
    // Do another thing
}
else if (compare < 30)
{
    // Do yet another thing
}
else
{
    // Do nothing
}
2 голосов
/ 18 марта 2011

Поскольку вы уже подтвердили, что compare >= 10 после первого if, вам действительно не нужен тест нижней границы для второго (или любого другого) if s ...

Это не красиво, но switch изначально был реализован хэшированием в C, так что он был на самом деле быстрее, чем цепочка if...else if. Такая реализация плохо подходит для общих диапазонов, и поэтому также допускаются только постоянные случаи.

Однако, для примера, который вы приводите, вы могли бы сделать что-то вроде:

switch(compare/10) {
    case 0:
        // Do one thing
    break;
    case 1:
        // Do another thing
    break;
    case 2:
        // Do yet another thing
    break;
    default;
        // Do nothing
    break;
}
...