程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中一種替換switch語句更優雅的寫法,

C#中一種替換switch語句更優雅的寫法,

編輯:C#入門知識

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就可以了。   

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved