当前位置:首页 > Windows程序 > 正文

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

2021-03-29 Windows程序

今天在项目中遇到了使用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就可以了。   

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/69723.html