zoukankan      html  css  js  c++  java
  • 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就可以了。

    原文链接:https://www.cnblogs.com/darrenji/p/4651540.html

  • 相关阅读:
    P2330 05四川 繁忙的都市
    Winform中实现更改DevExpress的RadioGroup的选项时更改其他控件(TextEdit、ColorPickEdit)的值
    Winform中实现读取xml配置文件并动态配置DevExpress的RadioGroup的选项
    Winform中对DevExpress的RadioGroup进行数据源绑定,即通过代码添加选项
    Winform中对自定义xml配置文件进行Xml节点的添加与删除
    Winform中自定义xml配置文件后对节点进行读取与写入
    C#中使用StreamReader实现文本文件的读取与写入
    Python编程书籍高清PDF免费下载
    Winform中自定义xml配置文件,并配置获取文件路径
    Winform中实现ZedGraph新增自定义Y轴上下限、颜色、标题功能
  • 原文地址:https://www.cnblogs.com/hong01072/p/14854361.html
Copyright © 2011-2022 走看看