|
发表于 2010-2-27 15:55:01
|
显示全部楼层
回复 15# afan
表驱动法简单来说就是把原来须要用类似 switch-case 之类语句来做的事用表的对应关系来做。它是初学者必备的武器。这么说太抽象,看个例子。它是一个根据学生的成绩来说出等级的类:
class Calc
{
private static double[] rangeLimit = { 50.0, 65.0, 75.0, 90.0, 100.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;
chars[i * 2] = hexDigits[b >> 4];
chars[i * 2 + 1] = hexDigits[b & 0xF];
}
return new string(chars);
}
static void Main() {
byte[] b = {0x00, 0x12, 0x34, 0x56, 0xAA, 0x55, 0xFF};
Console.WriteLine(ToHexString(b));
}
}
百度找的。 |
|