你的位置:首页 > ASP.net教程

[ASP.net教程]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就可以了。   




湖北旅游攻略大全湖北旅游路线推荐湖北自驾游攻略湖北旅游线路大全什么时候去湖北旅游最好2015德庆盘龙峡薰衣草花期多长?盘龙峡薰衣草能开到几月? 德庆盘龙峡薰衣草最佳观赏期?盘龙峡薰衣草什么时候最好看? 2015清明节广州去哪看薰衣草?广州2015清明节哪里有薰衣草? Mukul精品酒店 翡翠海岸的秘密花园 茂名放鸡岛有哪些娱乐项目?放鸡岛海上游乐世界适合多大儿童玩? 2015春节澳门环岛游有什么活动?珠海澳门环岛游春节主题活动介绍? 除了内在美,这些精品酒店有着夺人眼球的外在美[二] 2015春节韶关去哪里玩?韶关春节带家人孩子去哪里好玩? 哏儿都治愈系地界儿 周五来了周六还远吗 绚烂的红色日光在滨城大连赏最美日落 青岛:一场日出日落的旅行 万里长征之源 于都怀古休闲游 香港的劳力士价格会比大陆便宜吗?在哪里买比较好? 去香港买手表哪里好?香港哪里购物好? 香港百老汇在哪里?香港百老汇地址在哪里? 香港有哪些适合学生逛街的地方? AQ12EA820JAJME Datasheet AQ12EA820JAJME Datasheet 08055U1R6BAT2A Datasheet 08055U1R6BAT2A Datasheet SQCAEA220JATME Datasheet SQCAEA220JATME Datasheet 佳木斯到香港旅游团价格 佳木斯到香港旅游团价格 佳木斯到香港旅游团价格 成都到香港旅游价格 成都到香港旅游价格 成都到香港旅游价格 太原去香港旅游价格 太原去香港旅游价格 太原去香港旅游价格