我现在判断一个职称,每一个职称都有一个积分段
if(jifen>=0 and jifen<10)
{
zhicheng="初级";
}
elseif(jifen>=10 and jifen<100)
{zhicheng="学徒";}
.
.
.
.
elseif(jifen>=100000 and jifen<10000000)
{zhicheng="神仙";}
请问类似的应用 有if效率高吗 ,如果不高,有什么替代的方法  谢谢

解决方案 »

  1.   

    if与switch都是流程分支语句其中switch只能进行单个条件判断。能用switch则用switch
      

  2.   

    如果设断点观察一下,你会明白什么switch非常快了。如果用if那得从头判断到尾,switch不用。
      

  3.   

    这样的还是用switch case 好
      

  4.   

    用if和switch语句都可以,但if语句应该比switch快一些,
      

  5.   

    表面上看不出,只有从il代码上才能看出问题,引用:
    if vs. switch,测试与分析 
    记得在很久以前,博客园上一个哥们抱怨.net的源码写的太烂,到处都是switch,我当时就做过一个测试,证实了switch比if性能高许多。今天又看见这个话题,呵呵,那就再做个测试吧。代码: Code
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Text;namespace ConsoleApplication1
    {
        class Program
        {
            static Int32 Count = 100000000;        static Int32 TestIfElse(Int32 value)
            {
                Int32 i = 0;
                Stopwatch sw = new Stopwatch();
                sw.Start();
                for (int j = 0; j < Count; j++ )
                {
                    if (value == 1)
                        i += 1;
                    else if (value == 2)
                        i += 2;
                    else if (value == 3)
                        i += 3;
                    else if (value == 4)
                        i += 4;
                    else if (value == 5)
                        i += 5;
                }
                sw.Stop();
                Console.WriteLine("TestIfElse: " + sw.ElapsedMilliseconds);
                return i;
            }        static Int32 TestSwitch(Int32 value)
            {
                Int32 i = 0;            Stopwatch sw = new Stopwatch();
                sw.Start();            for (int j = 0; j < Count; j++)
                {
                    switch (value)
                    {
                        case 1:
                            i+=1;
                            break;
                        case 2:
                            i+=2;
                            break;
                        case 3:
                            i+=3;
                            break;
                        case 4:
                            i+=4;
                            break;
                        case 5:
                            i+=5;
                            break;
                        default:
                            break;
                    }
                }
                sw.Stop();
                Console.WriteLine("TestSwitch: " + sw.ElapsedMilliseconds);            return i;
            }        static void Main(string[] args)
            {
                TestIfElse(5);
                TestSwitch(5);
                Console.Read();
            }
        }
    } release下编译,测试结果:TestIfElse: 613
    TestSwitch: 1654倍左右的性能差距。反编译看il,会发现TestSwitch方法中多了这么一句:switch (L_0032, L_0038, L_003e, L_0044, L_004a)这句话实现了一个 jump table。正如一线工作者 所言,这个switch 指令是一个有索引的跳转,而if ... else 是无索引的跳转。if...else 是 O(N)级别的,switch ... case 是 O(1)级别的。如果将上面测试代码的分支增加到10支,测试TestSwitch(10)与TestIfElse(10)的性能,会发现前者比后者几乎快7-8倍。详细解释请参见《深入理解计算机系统》一书中的某章(忘了哪个章节,书不在身边,里面讲了switch和if的区别)。也可参考这篇文章:http://www.9php.com/FAQ/cxsjl/c/2008/10/1435098132356.html。.net下的分析见:http://www.cnblogs.com/yeah/archive/2009/02/16/1392094.html如果switch(String ..),测试了一下,switch与if...else性能相当。我原以为为是无法生成跳转表,刚看完http://www.cnblogs.com/yeah/archive/2009/02/16/1392094.html这篇文章,发现还是可以生成跳转表,只是这个跳转表的代价比简单的整数类型的跳转表代价高。也就是说,这种情况下,switch case 还是O(1)级别分支语句的。
      

  6.   

    如果判断一个字段的话,switch好,这种条件下switch也比if高
    如果判断条件不是那么唯一,还是if的好。
      

  7.   

    依据楼主的实例,还怎么用switch?
    看来只能用if,因为判断的是范围而不是具体某个值
      

  8.   

    如果判断的不是数字,那么怎么用Switch来判断呢?
      

  9.   

    如果判断的不是数字,那么怎么用Switch来判断呢?
    ----------------
    字符串,集合元素等都可以
      

  10.   

    你这个不能用switch吧,因为case后不能跟变量。
      

  11.   

    这个问题用不了switch   你这个判断的是范围  而用switch必须传的是单个值  该问题只能用if 建议在数据库中建立积分等级表 创建关系 这样更方便 不至于写这么多if 而且每次都判断
      

  12.   


    int jifen = 0;
    int flag = 0;
    string zhicheng = string.Empty;flag=jifen/10;  //注意类型switch(flag) 

    case 1 : 
    zhicheng = "初级";
    break; 
    case 10: 
    zhicheng = "学徒";
    break; 
    ...

      

  13.   

    测试结果显示,switch速度比if快。