可以定义';介于'之间;在C#中的if-else语句中?

可以定义';介于'之间;在C#中的if-else语句中?,c#,C#,我想问一个在C#方面比我有更强技能的人 是否可以减少以下代码 if(val > 20 && val < 40 ) ... else if(val > 40 && val < 72 ) ... else if(val > 72 && val < 88 ) ... else ... if(val>20&&val40&&val72&&val0&&source.CompareTo(b)=20&&val类范围{publi

我想问一个在C#方面比我有更强技能的人

是否可以减少以下代码

if(val > 20 && val < 40 )
...
else
if(val > 40 && val < 72 )
...
else
if(val > 72 && val < 88 )
...
else
...
if(val>20&&val<40)
...
其他的
如果(val>40&&val<72)
...
其他的
如果(val>72&&val<88)
...
其他的
...
让我们假设我有超过10-11条
if-else
语句

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

在sql中,我想到了类似于
之间的

定义一个:

if(val > 72)
{

}
else 
{
   if(val > 40)
   {
     ...
   }
   else
   {
     ...   
   }
}

正如oɔɯǝɹ在其评论中正确指出的,您可以更进一步,使用通用扩展方法支持的所有实现者:

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;
}
publicstaticbool-Between(这个T源代码,ta,tb),其中T:IComparable
{
返回source.CompareTo(a)>0&&source.CompareTo(b)<0;
}

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

您可以进行中间操作,但如果不需要更多的键入来调用它,那么它将是尽可能多的。在这种情况下,如果您确实想要
之间的
所做的,那么您应该更简洁地使用:

if(val >= 20 && val <= 88)
{
  if(val <= 40 )
  ...
  else if(val <= 72 )
  ...
}
else
 ...
if(val>=20&&val
类范围{public int first;public int second}
列表范围列表=新列表
用类写出列表中的所有组合

foreach( Range objRange in rangeList)
{
if( val>objRange.first && val<objRange.last)
{......
break;
}
}
foreach(范围列表中的范围对象范围)
{

在我看来,如果(val>objRange.first&&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;
    }
}
公共抽象类RangeBase
{
public int MinValue{get;private set;}
public int MaxValue{get;private set;}
公共抽象委托SomeDelegate{get;}
受保护的RangeBase(int-minValue、int-maxValue)
{
MinValue=MinValue;
MaxValue=MaxValue;
}
公共布尔值(整数)
{
返回编号>最小值&&number<最大值;
}
}

你在每个代码块中做的事情完全不同吗?你可以有一个包含20、40、72等的列表/数组。只要代码块可以是相同的,但索引是它所在的组。这在VB中是可能的,但据我所知不是在C中。公平地说@Magnus,你可以创建一个基于语法的库来匹配
s在VB中选择简洁的Case
语法(但框架中没有)。在VB.net中尝试一些东西,我将尝试转换为c#您可以构建自己的“中间”函数如图所示:@snake eye也试试我的这种方法,它可能会以标准方式缩短您的代码您确实需要处理类/变量名…它将显著提高代码的可读性。@Servy请建议概念是否为rht我已经为Naming编辑过它现在看起来好多了,尽管局部变量(即
范围列表
)通常以小写字母开头。
范围
中的字段当前也是私有的(这是默认值)。它们可能是公共属性,而不是私有字段。n现在:)servey我为sorten snake eye编写的代码与所有编程一样,这实际上是一种权衡。我喜欢这个解决方案,但最终它是足够的工作,您可能不会为当前项目节省任何实际时间。但是,如果您发现自己需要这个解决方案,他是一个很好的解决方案在许多项目中都是这样,在这种情况下,您可能希望将抽象基础放入一个库中,供将来的所有项目使用。您也可以将其作为一种通用的扩展方法:
publicstaticbool-Between(thistt-source,ta,tb):其中T:IComparable
foreach( Range objRange in rangeList)
{
if( val>objRange.first && val<objRange.last)
{......
break;
}
}
RangeBase range = collection.FirstOrDefault(x => x.BelongsToRange(42));
if(range != null)
{
    dynamic result = range.SomeDelegate.DynamicInvoke();
}
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;
    }
}