将C#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/tuboshu/p/10752364.html