12

我想问一个比我C#技能更强的人。

是否可以减少以下代码

if(val > 20 && val < 40 )
...
else
if(val > 40 && val < 72 )
...
else
if(val > 72 && val < 88 )
...
else
...

假设我有超过 10-11 条if-else语句。

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

我想到了类似betweensql 的东西。

4

6 回答 6

29

定义一个扩展方法

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;
}
于 2012-09-05T19:15:55.850 回答
4

另一种方法是将您的范围存储在 List 中并使用 Contains 函数来确定 val 是否在范围内,但如果没有更多信息,它看起来就像您尽可能短的一样。

于 2012-09-05T19:21:47.280 回答
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;
    }
}
于 2012-09-05T20:10:51.527 回答
1

您可以在两者之间进行,但如果不是更多的打字来调用它,它也会一样多。在这种情况下,如果你真的想要做什么between,那么你会更简洁:

if(val >= 20 && val <= 88)
{
  if(val <= 40 )
  ...
  else if(val <= 72 )
  ...
}
else
 ...

请注意,我正在使用<=and>=来匹配 between 行为。但是,我假设您确实既不想为值做两件事4072也不想做任何事情(在您的问题中,什么都不会做)。

于 2012-09-05T19:22:22.787 回答
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;
}
}
于 2012-09-05T19:28:43.523 回答
-1
if(val > 72)
{

}
else 
{
   if(val > 40)
   {
     ...
   }
   else
   {
     ...   
   }
}
于 2012-09-05T19:15:15.093 回答