可以定义类似于'之间的内容。在C#中的if-else语句中?

时间:2012-09-05 19:10:47

标签: c#

我想问一下在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

6 个答案:

答案 0 :(得分:28)

定义extension method

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