首页新闻招聘找找看知识库

新手一枚,求各位大神帮帮忙,我用什么更好的解决方法可以不用if判断

0
悬赏园豆:100 [已解决问题]

 

1=高级返佣,2=中级返佣,3=初级返佣

D=返佣等级

Y=营业部 Z=中级 C=初级

以上是代码中的字符代表的意义

 

if(Y.D=3)

{

  if(Z.D=3)

  {

    if(C.D=3)

    {

    }

    if(C.D=2)

    {

    }

    if(C.D=1)

    {

    }

  }

  if(Z.D=2)

  {

    if(C.D=3)

    {

    }

    if(C.D=2)

    {

    }

    if(C.D=1)

    {

    }

  }

  if(Z.D=1)

  {

    if(C.D=3)

    {

    }

    if(C.D=2)

    {

    }

    if(C.D=1)

    {

    }

  }

}

if(Y.D=2)

{

  if(Z.D=3)

  {

    if(C.D=3)

    {

    }

    if(C.D=2)

    {

    }

    if(C.D=1)

    {

    }

  }

  if(Z.D=2)

  {

    if(C.D=3)

    {

    }

    if(C.D=2)

    {

    }

    if(C.D=1)

    {

    }

  }

  if(Z.D=1)

  {

    if(C.D=3)

    {

    }

    if(C.D=2)

    {

    }

    if(C.D=1)

    {

    }

  }

}

if(Y.D=1)

{

  if(Z.D=3)

  {

    if(C.D=3)

    {

    }

    if(C.D=2)

    {

    }

    if(C.D=1)

    {

    }

  }

  if(Z.D=2)

  {

    if(C.D=3)

    {

    }

    if(C.D=2)

    {

    }

    if(C.D=1)

    {

    }

  }

  if(Z.D=1)

  {

    if(C.D=3)

    {

    }

    if(C.D=2)

    {

    }

    if(C.D=1)

    {

    }

  }

}

我敲代码我腿长的主页 我敲代码我腿长 | 初学一级 | 园豆:112
提问于:2017-09-13 10:47

问题补充:

不管是什么都行,最重要是让它的效率更好更快,因为数据量比较庞大

< >
分享
最佳答案
0

字典+委托,和冒泡没半毛钱关系。

收获园豆:100
Daniel Cai | 大侠五级 |园豆:7288 | 2017-09-13 10:51

我也刚搞开发没多久,好多东西都不会

我敲代码我腿长 | 园豆:112 (初学一级) | 2017-09-13 10:53

@我敲代码我腿长: 

先说你最外层的if判断,就3个值,3个值分别对应不同的分支逻辑(委托)

那么可以很容易转成Dictionary<int,Action>(考虑效率的情况下这里换成List做遍历也成,后面为了简单都以dictionary为例)

这里dictionary的key就对应你的三个值,value就对应你三个分支代码。

然后再到第二层中,其实也和第一层类似,那么前面提到的Action就又变成了一个类似最外层的Dictionary的判断逻辑,依次类推最后就可以把Action描述出来了。

当然这是做法中的一种,实现上性能好但中间在组织Action时很麻烦。

还有几种方式

1. 按照你的规则做成一个表,就算是塞到datatable中都行,表中每一行对应一种完整的分支的取值,最后加一列就是最内层if中实际的实现,使用的时候直接使用datatable的Select即可,找到对应的行后取最后加的那一列的委托执行下就可以了。这种实现也比较简单,较最前提到的方法更直观,但实现具有很强的片面性,如果逻辑变动的话这块是不太稳定的。

2.按照最初级的面相对象方式来实现,加上几个工厂最后返回创建出来的产品(最内层执行的逻辑),这种实现写的比较啰嗦,而且不好组织,写的不好的话也容易不稳定甚至有遗漏,但可读性较好,出现什么问题定位快。

3.简单的重构。你不是认为这块太丑太长么?那就把长的变短的,分支分治,最后外边套个大的if或者switch搞定。实现快,逻辑清晰,虽然有代码洁癖的可能还是会嗤鼻,但从宏观效果上看绝对碾压其他所有的方式,而且技术债务不会升高多少,以后有逻辑变动也是部分改动,实在不行了推掉重来也轻松。

Daniel Cai | 园豆:7288 (大侠五级) | 2017-09-13 12:20
其他回答(6)
0

百度下多态。。

子瓜01 | 园豆:260 (菜鸟二级) | 2017-09-13 11:32
0

if((Y.D<<2 | Z.D<<1 | C.D)=XXX)

{}

else if((Y.D<<2 | Z.D<<1 | C.D)=YYY)

{}

一共9中情况

tony_cyou | 园豆:266 (菜鸟二级) | 2017-09-13 12:43
0

hashmap->{ key,action};由yzc构成key即可;

简单干净高效;

 

用类当然更漂亮,不过效率没那么高——面向对象思维;

花飘水流兮 | 园豆:2469 (老鸟四级) | 2017-09-13 16:09
0

public void check(T t) {

    if(t.t == null) {

        return;

    }

    switch(t.t) {

       case d:

      //code

       break;

  }

    check(t);

}

YinJey | 园豆:220 (菜鸟二级) | 2017-09-14 00:43
0

三元表达式可以玩下

Steven* | 园豆:206 (菜鸟二级) | 2017-09-14 22:21
0

字典,扩展性好

回眸不笑 | 园豆:171 (初学一级) | 2017-09-15 09:18
   您需要登录以后才能回答,未注册用户请先注册