我想问一个比我C#技能更强的人。
是否可以减少以下代码
if(val > 20 && val < 40 )
...
else
if(val > 40 && val < 72 )
...
else
if(val > 72 && val < 88 )
...
else
...
假设我有超过 10-11 条if-else
语句。
缩短上述代码的最佳方法是什么?
我想到了类似between
sql 的东西。
我想问一个比我C#技能更强的人。
是否可以减少以下代码
if(val > 20 && val < 40 )
...
else
if(val > 40 && val < 72 )
...
else
if(val > 72 && val < 88 )
...
else
...
假设我有超过 10-11 条if-else
语句。
缩短上述代码的最佳方法是什么?
我想到了类似between
sql 的东西。
定义一个扩展方法:
public static bool Between(this int source, int a, int b)
{
return source > a && source < b;
}
然后,使用它:
if (val.Between(20, 40))
//...
正如 oɔɯǝɹ 在他的评论中正确指出的那样,您可以更进一步,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;
}
另一种方法是将您的范围存储在 List 中并使用 Contains 函数来确定 val 是否在范围内,但如果没有更多信息,它看起来就像您尽可能短的一样。
在我看来,收集范围是件好事。如果块内的逻辑非常相似,您可以存储与此范围关联的委托。
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;
}
}
您可以在两者之间进行,但如果不是更多的打字来调用它,它也会一样多。在这种情况下,如果你真的想要做什么between
,那么你会更简洁:
if(val >= 20 && val <= 88)
{
if(val <= 40 )
...
else if(val <= 72 )
...
}
else
...
请注意,我正在使用<=
and>=
来匹配 between 行为。但是,我假设您确实既不想为值做两件事40
,72
也不想做任何事情(在您的问题中,什么都不会做)。
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;
}
}
if(val > 72)
{
}
else
{
if(val > 40)
{
...
}
else
{
...
}
}