Можно определить что-то вроде "между" в инструкции 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
{
...
}
}