首页 新闻 会员 周边 捐助

多重is else 的优化

0
[已解决问题] 解决于 2014-04-18 15:29

 if (salaryItem.CodeId == new Guid("{00000000-00a1-aaaa-0000-010000000002}"))//请假
            {
                div.AddExpando("CheckItem", AppraiseItem.Leave.ToString("D"));
                div.AddExpando("CheckSubItem", salaryItem.CodeItemValue.ToString());
            }
            else if (salaryItem.CodeId == new Guid("{00000000-00a1-aaaa-0000-010000000005}"))//加班
            {
                div.AddExpando("CheckItem", AppraiseItem.OverTime.ToString("D"));
                div.AddExpando("CheckSubItem", salaryItem.CodeItemValue.ToString());
            }
            else if (salaryItem.CodeId == new Guid("{00000000-00a1-aaaa-0000-010000010005}"))//旷工
            {
                div.AddExpando("CheckItem", AppraiseItem.Absence.ToString("D"));
            }
            else if (salaryItem.CodeId == new Guid("{00000000-00a1-aaaa-0000-010000020005}"))//迟到
            {
                div.AddExpando("CheckItem", AppraiseItem.Late.ToString("D"));
            }
            else if (salaryItem.CodeId == new Guid("{00000000-00a1-aaaa-0000-010000030005}"))//早退
            {
                div.AddExpando("CheckItem", AppraiseItem.LeaveEarly.ToString("D"));
            }

 

这句代码如何优化最好?

c#
何小宝的主页 何小宝 | 初学一级 | 园豆:19
提问于:2014-04-14 14:51
< >
分享
最佳答案
0

由于NewGuid()可读性差,同时为了提高可复用性,可以中间过度一步

public enum WorkState:long

{

    Unknow=0,

    LeaveWork=1,//请假

    ExtraWork=2,//加班

    AbsentWork=3,//旷工

    Late=4,//迟到

    Leave_early=5,//早退

}

而过度方法,也是分离部分为:

private long GenerateIntID(Guid guidId)

 {
            byte[] buffer = guidId.ToByteArray();
            return BitConverter.ToInt64(buffer, 0);
  }

 

最终调用

switch(GetWorkState(GenerateIntID(salaryItem.CodeId))

{

    case WorkState.LeaveWork:

      {

                div.AddExpando("CheckItem", AppraiseItem.Leave.ToString("D"));
                div.AddExpando("CheckSubItem", salaryItem.CodeItemValue.ToString());

      };

      break;

}

奖励园豆:5
king2003 | 初学一级 |园豆:161 | 2014-04-14 17:45

我都说了是 16 字节,你还 ConvertToInt64,你得用 decimal 来表示。

Launcher | 园豆:45050 (高人七级) | 2014-04-14 18:00

@Launcher: 麻烦你以后,回答别人问题,写代码出来,用心帮助人家,不是光动嘴皮子,讲理论。还在这里说三道四。

king2003 | 园豆:161 (初学一级) | 2014-04-14 18:07

@king2003: 我就随便摘录几条我以前回答的问题,按照你的要求,有代码,请你再给评价下,我是不是光动嘴皮子,只讲理论:

http://q.cnblogs.com/q/6131/
http://q.cnblogs.com/q/15819/
http://q.cnblogs.com/q/15657/
http://q.cnblogs.com/q/10140/
http://q.cnblogs.com/q/16775/
http://q.cnblogs.com/q/16711/

 

回答问题有个原则,有些可以给代码,有些不能,为什么呢?因为你不能替代提问者工作。

Launcher | 园豆:45050 (高人七级) | 2014-04-15 09:18
其他回答(3)
0

这种用switch,最好把这段代码抽出来重新封装成一个新方法

吴瑞祥 | 园豆:29449 (高人七级) | 2014-04-14 15:02

switch 的参数要是整型的 我现在就是这边没有整型可以作为参数。

已经提取出来作为一个单独的方法了 就是看看能不能更好的优化。

支持(0) 反对(0) 何小宝 | 园豆:19 (初学一级) | 2014-04-14 15:06

@何小宝: 谁跟你说switch的参数要是整型的?

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-04-14 16:12
0

可以 switch 字符串的吧!,你把 GUID 转成字符串不就行了,。

另外 GUID 还可以转换成 16 * 8 位整数,还可以 GetHashCode。

这样的话,你既可以用 switch,还可以用 map 。

Launcher | 园豆:45050 (高人七级) | 2014-04-14 15:34
0

楼主可以看看重构这本书,也许是你想要的……

Albert Fei | 园豆:2102 (老鸟四级) | 2014-04-15 14:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册