可以定义';介于'之间;在C#中的if-else语句中?
我想问一个在C#方面比我有更强技能的人 是否可以减少以下代码可以定义';介于'之间;在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
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;
}
}