可以在C#的if-else语句中定义类似’between’之类的东西吗?


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个if-else语句。

缩短上述代码的最佳方法是什么?

在SQL中,我想到了类似于between的东西。


定义扩展方法:

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?????在他的评论中正确指出,您可以更进一步,使用通用扩展方法支持IComparable的所有实现者:

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;
    }
}


你可以在两者之间做一个,但如果不是更多的输入来调用它的话,它也会是一样多的。在这种情况下,如果您真的想要between所做的,那么您可以更简洁地:

1
2
3
4
5
6
7
8
9
if(val >= 20 && val <= 88)
{
  if(val <= 40 )
  ...
  else if(val <= 72 )
  ...
}
else
 ...

注意,我正在使用<=>=来匹配这两种行为。但是,我假设你既不想为价值观做两件事——确切地说是40,确切地说是72,也不想做任何事(在你的问题中,什么都不做)。


1
2
3
class Range{ public int first; public int second}

list<Range> rangeList= new list<Range>

用类将所有组合写入列表中

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
   {
     ...  
   }
}