表驱动法简单来说就是把原来须要用类似 switch-case 之类语句来做的事用表的对应关系来做。它是初学者必备的武器。这么说太抽象,看个例子。它是一个根据学生的成绩来说出等级的类:
    class Calc
    
{
        
private static double[] rangeLimit = 50.065.075.090.0100.0 };
        
private static string[] grade = "F""D""C""B""A" };
        
private static readonly int maxLevel = grade.Length - 1;
 
        
public static string CalculateGrade(double score)
        
{
            
int level = 0;
            
while (level <= maxLevel)
            
{
                
if (score < rangeLimit[level]) return grade[level];
                
else level++;
            }

            
return grade[maxLevel];
        }

    }
如果你的成绩是 89,那么你的等级应该是 B。上面例子很好懂。但是要注意边界的问题。这是个做范围判断的例子。下面是一个一一对应的例子。这个类会把一个十进制的正整数转换成它的十六进制表示:
 
 
   class Calc
    
{
        
private static string[] hexChars = "0""1""2""3""4""5""6""7""8""9""A""B""C""D""E""F" };
 
        
private static string ConvertToHexFormat(uint digits)
        
{
            Stack
<string> stack = new Stack<string>();
 
            
uint tmp;
            
do
            
{
                tmp 
= digits & 0xF;
                stack.Push(hexChars[tmp]);
                digits 
= digits >> 4;
            }

            
while (digits != 0);
 
            StringBuilder sb 
= new StringBuilder();
            
while (stack.Count > 0)
            
{
                sb.Append(stack.Pop());
            }

 
            
return sb.ToString();
        }

 
        
public static string Convert(uint digits)
        
{
            
return ConvertToHexFormat(digits);
        }

 
        
public static string Convert(string digits)
        
{
            
uint tmp = uint.Parse(digits);
            
return ConvertToHexFormat(tmp);
        }

}

 
怎么样?很爽吧。核心的代码不过 3 句而已!
 
表驱动法可以让你省去一大堆令人头晕的条件判断语句,让代码看起来更优雅。本文只是让你对它有一个直观的印象,并不包含它全面的知识。它还包括定义索引等其它的东西。比如说,上面的等级评定的示例中,负责查找等级的循环明显是程序的主要消耗所在。你可以考虑用二分法之类的方法来节省时间。如果表中包含的元素数十分巨大怎么办?定义个索引。
 
最后给一个把 byte[] 转换成它对应的十六进制表示的例子。以前 CSDN 上有人问过,说为什么我用 framework 里的 MD5ServiceProvider 提供的方法来计算,得到的结果不唯一?答案是你的结果没有转换成它的等价的字符串表示。下面是 MSDN 上的方法,有了它,你再用 MD5ServiceProvider 就不会有问题了:
 
class HexTest
{
    
static char[] hexDigits = {
        
'0''1''2''3''4''5''6''7',
        
'8''9''A''B''C''D''E''F'}
;
 
    
public static string ToHexString(byte[] bytes) {
        
char[] chars = new char[bytes.Length * 2];
        
for (int i = 0; i < bytes.Length; i++{
            
int b = bytes[i];
            chars[i 
* 2= hexDigits[b >> 4];
            chars[i 
* 2 + 1= hexDigits[b & 0xF];
        }

        
return new string(chars);
    }

 
    
static void Main() {
 
        
byte[] b = {0x000x120x340x560xAA0x550xFF};
        Console.WriteLine(ToHexString(b));
    }

}