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

转载 2015年11月18日 14:19:41

今天在项目中遇到了使用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语句的优化

1 一直以为C#中的switch语句在处理字符串时是用if语句来构造的,因为.net的IL中的switch也逃不脱C的宿命--只能2 处理数字,而实际上C#编译器对switch语句对字符...
  • gu_fan
  • gu_fan
  • 2006年06月22日 12:38
  • 9490

c#——switch case语句

c#——switch case语句 c#中的switch case语句有三种结构,具体形式如下图所示: (1)Switch的第一种结构:(如例1) ...
  • haiyan_cf
  • haiyan_cf
  • 2012年03月07日 17:17
  • 26176

C++与C#对比学习:switch

平时碰到分支条件判断最常用的是if else语句,不过有时要是分支条件太多用switch就更直观,方便一点.先举两个简单的例子. C++: int num = 2; switch(num) { cas...
  • weiwenhp
  • weiwenhp
  • 2012年09月06日 17:49
  • 2184

使用多态替代If else或switch的更多尝试

  • sanniao
  • sanniao
  • 2016年11月03日 21:14
  • 2490

c#知识点(一)

当使用String str="abc",这种方式时,先去内存的Heap中找是否存在"abc"这个字符串,若存在,则将地址引用。若不存在则创建。 2.当使用String str=new String(...
  • farmwang
  • farmwang
  • 2017年01月09日 21:58
  • 340

替换switch case方法的方式2--反射

public static final HashMap sMethods; public static final int GET_NEW_APPS=96; static { sMethod...
  • androidzhaoxiaogang
  • androidzhaoxiaogang
  • 2013年03月04日 22:49
  • 1646

《重构》C#版实现(四)switch的多态化处理

上一篇主要重构了Statement方法,在大刀阔斧的调整后,总算是得到了一个易于理解的方法体。当然,其中会带来潜在的效率问题,但记住一点,起码所有的事情都是经过权衡和决策的。可以“果断”来形容,而那种...
  • virtualxmars
  • virtualxmars
  • 2012年07月13日 14:51
  • 2102

学习C# 继承 封装 多态

C# 中访问修饰符: Private:只有类本身能存取. Protected:类和派生类可以存取. Internal:只有同一个项目中的类可以存取...
  • qq_33481237
  • qq_33481237
  • 2016年02月13日 15:04
  • 1856

重构:运用Java反射加多态 “干掉” switch

前言:本篇文章主要描述我是如何通过Java的反射加多态干掉 swtich这个代码的坏味道 目录 代码的坏味道 《重构》曰 遭遇switch 利剑:多态加反射 结束战斗 代码的坏味道 有这么一句话:...
  • wwh578867817
  • wwh578867817
  • 2015年10月21日 22:08
  • 5141

C#中switch语句注意

大家肯定对switch语句并不陌生,它能够让程序根据控制表达式的值,从多个动作中作出选择(从逻辑过程看,和多分支语句if-else有些相似)。在C++和java中也有这一语句,不过在C#中,这一语句则...
  • 21aspnet
  • 21aspnet
  • 2007年03月24日 15:35
  • 5606
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#中一种替换switch语句更优雅的写法
举报原因:
原因补充:

(最多只允许输入30个字)