我想问一下在C#中技能比我强的人。
是否可以减少以下代码
if(val > 20 && val < 40 )
...
else
if(val > 40 && val < 72 )
...
else
if(val > 72 && val < 88 )
...
else
...
我们假设我有超过10-11 if-else
个陈述。
缩短上述代码的最佳方法是什么?
我在sql中想到了between
。
答案 0 :(得分:28)
public static bool Between(this int source, int a, int b)
{
return source > a && source < b;
}
然后,使用它:
if (val.Between(20, 40))
//...
正如o comment在他的评论中正确指出的那样,你可以更进一步,并通过一般的扩展方法支持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;
}
答案 1 :(得分:4)
另一种方法是将范围存储在List中,并使用Contains函数查明val是否在该范围内,但没有更多信息,看起来它就像你可以做到的那样短。< / p>
答案 2 :(得分:1)
你可以做一个介于两者之间,但如果没有更多的打字就可以调用它。在这种情况下,如果你真的想要between
做什么,那么你会更简洁:
if(val >= 20 && val <= 88)
{
if(val <= 40 )
...
else if(val <= 72 )
...
}
else
...
请注意,我正在使用<=
和>=
来匹配两种行为。但是,我假设你确实想要完全没有为值40
完成两件事,确切地72
,也没有做任何事情(在你的问题中,什么都不做)。
答案 3 :(得分:1)
在我看来,收集范围是件好事。如果块内的逻辑非常相似,则可以存储与此范围关联的委托。
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;
}
}
答案 4 :(得分:0)
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;
}
}
答案 5 :(得分:-1)
if(val > 72)
{
}
else
{
if(val > 40)
{
...
}
else
{
...
}
}