It is possible to define something like 'between' in if-else statement in C#?
我想问一个比我更擅长C的人。
是否可以减少以下代码
1 2 3 4 5 6 7 8 9 10 | if(val > 20 && val < 40 ) ... else if(val > 40 && val < 72 ) ... else if(val > 72 && val < 88 ) ... else ... |
假设我有超过10-11个
缩短上述代码的最佳方法是什么?
在SQL中,我想到了类似于
定义扩展方法:
1 2 3 4 | public static bool Between(this int source, int a, int b) { return source > a && source < b; } |
然后,使用它:
1 2 | if (val.Between(20, 40)) //... |
作为O?????在他的评论中正确指出,您可以更进一步,使用通用扩展方法支持
1 2 3 4 | 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; } |
另一种方法是将您的范围存储在列表中,并使用contains函数来确定val是否在范围内,但是如果没有更多信息,它看起来像是尽可能短的值。
在我看来,收集范围很好。如果块内的逻辑非常相似,您可以存储与这个范围相关联的委托。
1 2 3 4 5 | RangeBase range = collection.FirstOrDefault(x => x.BelongsToRange(42)); if(range != null) { dynamic result = range.SomeDelegate.DynamicInvoke(); } |
其中rangebase是一个简单的抽象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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; } } |
你可以在两者之间做一个,但如果不是更多的输入来调用它的话,它也会是一样多的。在这种情况下,如果您真的想要
1 2 3 4 5 6 7 8 9 | if(val >= 20 && val <= 88) { if(val <= 40 ) ... else if(val <= 72 ) ... } else ... |
注意,我正在使用
1 2 3 |
用类将所有组合写入列表中
1 2 3 4 5 6 7 | foreach( Range objRange in rangeList) { if( val>objRange.first && val<objRange.last) {...... break; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | if(val > 72) { } else { if(val > 40) { ... } else { ... } } |