C#中⼀种替换switch语句更优雅的写法
今天在项⽬中遇到了使⽤switch语句判断条件,但问题是条件⽐较多,⼤概有⼏⼗个条件,满屏幕的case判断,是否有更优雅的写法替代switch语句呢?
假设有这样的⼀个场景:商场经常会根据情况采取不同的打折⽅案,如果打折⽅案⽐较少,可以考虑使⽤switch语句作判断。但如果有⼏⼗甚⾄⼏百种打折⽅案的时候,⽤switch语句就不够优雅。
先来⼀个打折接⼝。
public interface IValueProcessor
{
decimal DaZhe(short policy,decimal orginPrice);
}
形参policy⽤来接收有关打折的枚举项,形参orginPrice表⽰打折前的价格。有关打折的枚举项为:
public enum PolicyEnum
{
Wuzhe = 0,
LiuZhe = 1,
QiZhe =2,
BaZhe =3,
JiuZhe = 4
}
实现IValueProcessor接⼝,根据不同的PolicyEnum项采取不同的算法。
public class MyValueProcessor : IValueProcessor
{
public decimal DaZhe(short policy,decimal orginPrice)
{
switch (policy)
{
case (short)PolicyEnum.Wuzhe:
return orginPrice / 2;
case (short)PolicyEnum.LiuZhe:
return orginPrice * (decimal)0.6;
case (short)PolicyEnum.QiZhe:
return orginPrice * (decimal)0.7;
case (short)PolicyEnum.BaZhe:
return orginPrice * (decimal)0.8;
case (short)PolicyEnum.JiuZhe:
return orginPrice * (decimal)0.9;
default:
return orginPrice / 2;
}
}
}
客户端调⽤如下:
static void Main(string[] args)
{
Console.WriteLine("请输⼊打折政策,0表⽰5折,1表⽰6折,2表⽰7折,3表⽰8折,4表⽰9折:");
string policy = Console.ReadLine();
decimal originPrice = (decimal)100.00;
Console.WriteLine("打折前的价格为:"+ originPrice);
MyValueProcessor processor = new MyValueProcessor();
Console.WriteLine("打折后的价格为:"+ processor.DaZhe(short.Parse(policy),originPrice));
Console.ReadKey();
}
以上写法没有太⼤的问题,是否有替换switch判断,⼀种更优雅的写法呢?
在MyValueProcessor类的DaZhe(short policy,decimal orginPrice)⽅法中,接收⼀个short类型的形参和⼀个decimal类型的形参,返回decimal类型,在⽅法内部,把short类型的形参作为switch语句的判断条件,再使⽤不同的算法得到返回值。可以进⼀步抽象:把short类型作为字典集合中的key,把算法,即委托作为字典集合的value。这样,我们就可以把各种打折⽅案封装在字典集合中。修改如下:
writeline用什么替代
public class MyValueProcessor : IValueProcessor
{
private readonly Dictionary<short, Func<decimal, decimal>> _dic;
public MyValueProcessor()
{
_dic = new Dictionary<short, Func<decimal, decimal>>
{
{0, m => m * (decimal)0.5},
{1, m => m * (decimal)0.6},
{2, m => m * (decimal)0.7},
{3, m => m * (decimal)0.8},
{4, m => m * (decimal)0.9}
};
}
public decimal DaZhe(short policy,decimal orginPrice)
{
if (_dic.ContainsKey(policy))
{
return _dic[policy].Invoke(orginPrice);
}
return orginPrice / 2;
}
}
这样,在DaZhe(short policy,decimal orginPrice)⽅法内部,只要判断传⼊的short类型实参是否是字典集合的key就可以了。原⽂链接:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。