Можно определить что-то вроде "между" в инструкции if-else в С#?

Я хочу спросить кого-то, кто имеет более сильные навыки, чем я, на С#.

Можно ли уменьшить следующий код

if(val > 20 && val < 40 )
...
else
if(val > 40 && val < 72 )
...
else
if(val > 72 && val < 88 )
...
else
...

Предположим, что у меня есть более 10-11 if-else операторов.

Какой лучший способ сократить приведенный выше код?

Я подумал над чем-то вроде between в sql.

Ответ 1

Определите метод расширения:

public static bool Between(this int source, int a, int b)
{
    return source > a && source < b;
}

Затем используйте его:

if (val.Between(20, 40))
//...

Как правильно указал в своем комментарии, вы можете сделать еще один шаг и поддержать всех разработчиков IComparable<T> с помощью общего метода расширения:

public static bool Between<T>(this T source, T a, T b) where T : IComparable<T>
{
    return source.CompareTo(a) > 0 && source.CompareTo(b) < 0;
}

Ответ 2

Альтернативный способ сделать это - сохранить диапазоны в списке и использовать функцию Содержит, чтобы узнать, находится ли значение val в пределах диапазона, но без дополнительной информации это выглядит так, как будто у вас есть это как можно короче.

Ответ 3

Вы можете сделать промежуток, но это будет так много, если не больше, чтобы набрать его. В этом случае, если вы действительно хотите, что делает between, то вы бы более лаконичны с:

if(val >= 20 && val <= 88)
{
  if(val <= 40 )
  ...
  else if(val <= 72 )
  ...
}
else
 ...

Обратите внимание, что я использую <= и >= для соответствия между поведением. Тем не менее, я предполагаю, что вы не хотели, чтобы две вещи выполнялись для значений точно 40, точно 72, и ничего не сделано (в вашем вопросе ничего не будет сделано).

Ответ 4

По-моему, хорошо иметь коллекцию диапазонов. И если логика внутри блоков довольно похожа, вы можете сохранить делегат, связанный с этим диапазоном.

RangeBase range = collection.FirstOrDefault(x => x.BelongsToRange(42));
if(range != null)
{
    dynamic result = range.SomeDelegate.DynamicInvoke();
}

Где RangeBase - простая абстракция:

public abstract class RangeBase
{
    public int MinValue { get; private set; }
    public int MaxValue { get; private set; }

    public abstract Delegate SomeDelegate { get; }

    protected RangeBase(int minValue, int maxValue)
    {
        MinValue = minValue;
        MaxValue = maxValue;
    }

    public bool BelongsToRange(int number)
    {
        return number > MinValue && number < MaxValue;
    }
}

Ответ 5

class Range{ public int first; public int second}

list<Range> rangeList= new list<Range>

записать все комбинации в список с классом

foreach( Range objRange in rangeList)
{
if( val>objRange.first && val<objRange.last)
{......
break;
}
}

Ответ 6

if(val > 72)
{

}
else 
{
   if(val > 40)
   {
     ...
   }
   else
   {
     ...   
   }
}