• 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#控件——DataGridView单元格文本自动换行
    【转】右键的 在 vs 中打开 怎么去掉
    【转】C#使用Oracle.ManagedDataAccess.dll
    C#委托笔记
    【转】检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问
    js创建ActiveXObject无效
    ASPxGridView编辑时弹出的editform值不是当前行值的原因
    ASPxGridView后台实现隐藏新增按钮
    oracle闪回存储过程
    oracle重新编译所有invalid objects
  • 原文地址:https://www.cnblogs.com/darrenji/p/4651540.html
Copyright © 2020-2023  润新知