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。这样,我们就可以把各种打折方案封装在字典集合中。修改如下:
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就可以了。
C#中一种替换switch语句更优雅的写法的更多相关文章
- SQL中两种表复制语句
Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我 ...
- php中switch语句case后表达式写法记录一
可作等级评价: $var = 95; switch(true){ case $var < 100; $level = 1; break; case $var < 95; $level = ...
- eclipse中更改配置使得switch语句不出错
分别点击: windows---preference--->java---->compiler--->error/waring---->potential programmin ...
- MySQL比like语句更高效的写法locate position instr find_in_set
使用内部函数instr,可代替传统的like方式查询,并且速度更快. instr函数,第一个参数是字段,第二个参数是要查询的串,返回串的位置,第一个是1,如果没找到就是0. 例如, select na ...
- C# 多个个Dictionary合并更优雅的写法
Dictionary 现在有两个Dictionary的对象,想把两个对象的中数据合并成一个. 使用for循环的话觉得非常不合适,于是考虑是否有相应的方法,网上找了很多,都是for循环,最后终于找到了一 ...
- if else 更优雅的写法(转)
https://www.cnblogs.com/y896926473/articles/9675819.html
- Python 为什么不支持 switch 语句?
本文出自"Python为什么"系列,请查看全部文章 在这篇文章里,我们会聊一聊为什么 Python 决定不支持 switch 语句. 为什么想要聊这个话题呢? 主要是因为 swit ...
- 2、Golang基础--包的使用、if-else语句、循环、switch语句、数组、切片、可变函数参数、map类型
1 包的使用 // 为了便于组织代码,同一种类型的代码,写在同一个包下,便于管理 // 定义包 -新建一个文件夹 -内部有很多go文件 -在每个go文件的第一行,都要声明包名,并且包名必须一致 -在一 ...
- 多路开关模式的switch语句
在实例10中,将break语句去掉之后,会将符合检验条件后的所有语句都输出.利用这个特点,可以设计多路开关模式的switch语句,例如:在平年一年12个月,1.3.5.7.8.10.12月是31天,4 ...
随机推荐
- 利用shell找出15分钟内修改的文件
如果你的文件只是生成不会修改的话,可以这样: find * -mmin -15 2>/dev/null 如果可能修改,则需要这样(先创建一个 15 分之前的时间戳的文件,然后找比这个文件新的文件 ...
- history命令追查登录的用户和时间
Linux查看History记录加时间,这个对于系统管理员还是很有帮助的,原因不解释,你懂得!ora11g$ history | more 1 rlwrap sqlplus / as sy ...
- JS实现文本中查找并替换字符
JS实现文本中查找并替换字符 效果图: 代码如下,复制即可使用: <!DOCTYPE html><html> <head> <style type=" ...
- Online DDL工具的安装与使用
最近经常在线上经常遇到有性能问题的SQL,有些表没有合理添加索引,有些表添加的索引不合理,各种各样的问题,导致SQL的执行效率不高.这时DBA们不得不重构SQL,使其达到最好的性能,这时我们往往要在线 ...
- Java编程的逻辑 (59) - 文件和目录操作
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- 字符串匹配的kmp算法 及 python实现
一:背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常 ...
- NET WebAPi之断点续传下载(下)
NET WebAPi之断点续传下载(下) 前言 上一篇我们穿插了C#的内容,本篇我们继续来讲讲webapi中断点续传的其他情况以及利用webclient来实现断点续传,至此关于webapi断点续传下载 ...
- 前端架构之路:Windows下安装Nodejs步骤
最近打算把我们的微信端用Vue.js重构,为什么选择Vue.js,一是之前使用的是传统的asp.net mvc,多页面应用用户体验比单页面要差.二是使用过Angular.js,感觉对开发人员要求较 ...
- jmeter内存溢出处理方式记录
方法一: 使用jmeter进行压力测试时 遇到一段时间后报内存溢出outfmenmory错误,导致jmeter卡死了,先尝试在jmeter.bat中增加了JVM_ARGS="- Xmx204 ...
- 阿里云服务器(windows)配置项目域名
一.数据库是放在阿里云上!二.项目部署到服务器上,tomcat会一直运行(除非你手动停止)三.设置域名及tomcat配置(1)在阿里云控制台上的域名解析设置中添加记录,将域名映射到你的阿里云esc公网 ...