C#中一种替换switch语句更优雅的写法

发表于:2015-7-17 10:50

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Darren Ji    来源:51Testing软件测试网原创

#
DoNet
分享:
  今天在项目中遇到了使用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。这样,我们就可以把各种打折方案封装在字典集合中。修改如下:
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就可以了。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号