一:什么是表驱动法
所谓表驱动法(Table-Driven Approach),简单讲是指用查表的方法获取值。
我们平时查字典以及念初中时查《数学用表》找立方根就是典型的表驱动法。在数值不多的时候我们可以用逻辑语句(if 或case)的方法来获取值,但随着数值的增多逻辑语句就会越来越长,此时表驱动法的优势就显现出来了。
二:简单示例
在我几天前的一篇条码序列的文章中提到用36进制(A表示10,B表示11,...)来表示更大的数字,如果用逻辑来表示的话可能会写成:
Code 用逻辑语句实现36进制
代码实在是太长了,按时髦的说法“代码臭味”太浓了。
但要是存在一个表的话,代码就非常简单了
C# code 使用表驱动法
numChar=numChars[i];
这行代码假设已经建好了一个numChars的表,此时我们将数据存在一个表中而不是if判断中.
三:查表的方式
在使用表驱动法的时候必须要解决的一个问题就是如何查表.
我们可以用非常直接的方式查一个表,就如前面示例讲的我就用数组下标就好了,但你发现有谁查字典甚至《数学用表》是直接依靠页码来查的吗?这是肯定行不通的。
常用的查表方式有
3.1 直接查询
直接查询,是指无需绕圈子,用下标的方式就能顺利的获取到数据;
Code C#示例 逻辑方式获取星期名称
实现同样的功能,我们可以将这些数据存储到一个表里
C#代码 表驱动法获取星期名称
string[] dayNames=new string[]{"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
dayName=dayNames[day];
只要一条语句就可以代替长长的if-else语句
如果某一天我们的网站要根据访客选择的语言来显示星期几的话
表驱动法仍然很简单
C#代码 表驱动法获取星期名称
dayName=dayNames[day,(int)GetUserLanguage()];
但如果是用if-else的话,那长度可就的翻番啊。
3.2 索引查找
在用一个简单方法无法将“英文单词”这样数据转换成表下标时,可以考虑使用索引来查找.在.net中的Dictionary<K,V> 就是一个典型的例子
C#代码 获取一个用户对象
Dictionary<string,User> users=GetAllUsers();
User tom=users["Tom"];
其实我们常用的DataTable就可以用索引查找的方式来获取数据
假如有个人员信息的table
C#代码 用索引查找方式从DataTable中获取第一个用户的姓名
DataTable userInfo=dal.GetAllUsersInfo();
name=userInfo.Rows[0].Columns["UserName"];
使用索引查询的主要优点就是代码的可读性大为增强,可维护性也更好
C#代码 用直接查找方式从DataTable中获取第一个用户的姓名
DataTable userInfo=dal.GetAllUsersInfo();
name=userInfo.Rows[i].Columns[3];
对比上一段代码,columns[3]很让人不知所谓;此外如果返回的Datable返回的列顺序改变的话就必须更改魔术数字3,否则代码就会出错;
3.3 分段查找
分段查找通过确定数据所处的范围确定分类(下标)
使用分段查找,需要先把每一个区间的上限写在一个表中,然后通过循环确定所处的区段,最后获得相应的等级
C#示例 根据分数查绩效等级
private static double[] rangeLimit = { 60.0, 75.0, 85.0, 95.0,100.0 };
private static string[] grade = {"不合格", "合乎要求", "良好", "优秀" ,"卓越"};
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];
}
Shinn@cnblogs
2008年4月16日
#原创不易,转载请保留签名
所谓表驱动法(Table-Driven Approach),简单讲是指用查表的方法获取值。
我们平时查字典以及念初中时查《数学用表》找立方根就是典型的表驱动法。在数值不多的时候我们可以用逻辑语句(if 或case)的方法来获取值,但随着数值的增多逻辑语句就会越来越长,此时表驱动法的优势就显现出来了。
二:简单示例
在我几天前的一篇条码序列的文章中提到用36进制(A表示10,B表示11,...)来表示更大的数字,如果用逻辑来表示的话可能会写成:

代码实在是太长了,按时髦的说法“代码臭味”太浓了。
但要是存在一个表的话,代码就非常简单了
C# code 使用表驱动法
numChar=numChars[i];
这行代码假设已经建好了一个numChars的表,此时我们将数据存在一个表中而不是if判断中.
三:查表的方式
在使用表驱动法的时候必须要解决的一个问题就是如何查表.
我们可以用非常直接的方式查一个表,就如前面示例讲的我就用数组下标就好了,但你发现有谁查字典甚至《数学用表》是直接依靠页码来查的吗?这是肯定行不通的。
常用的查表方式有
- 直接查询
- 索引查询
- 分段查询
3.1 直接查询
直接查询,是指无需绕圈子,用下标的方式就能顺利的获取到数据;

实现同样的功能,我们可以将这些数据存储到一个表里
C#代码 表驱动法获取星期名称
string[] dayNames=new string[]{"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
dayName=dayNames[day];
只要一条语句就可以代替长长的if-else语句
如果某一天我们的网站要根据访客选择的语言来显示星期几的话
表驱动法仍然很简单
C#代码 表驱动法获取星期名称
dayName=dayNames[day,(int)GetUserLanguage()];
但如果是用if-else的话,那长度可就的翻番啊。
3.2 索引查找
在用一个简单方法无法将“英文单词”这样数据转换成表下标时,可以考虑使用索引来查找.在.net中的Dictionary<K,V> 就是一个典型的例子
C#代码 获取一个用户对象
Dictionary<string,User> users=GetAllUsers();
User tom=users["Tom"];
其实我们常用的DataTable就可以用索引查找的方式来获取数据
假如有个人员信息的table
C#代码 用索引查找方式从DataTable中获取第一个用户的姓名
DataTable userInfo=dal.GetAllUsersInfo();
name=userInfo.Rows[0].Columns["UserName"];
使用索引查询的主要优点就是代码的可读性大为增强,可维护性也更好
C#代码 用直接查找方式从DataTable中获取第一个用户的姓名
DataTable userInfo=dal.GetAllUsersInfo();
name=userInfo.Rows[i].Columns[3];
对比上一段代码,columns[3]很让人不知所谓;此外如果返回的Datable返回的列顺序改变的话就必须更改魔术数字3,否则代码就会出错;
3.3 分段查找
分段查找通过确定数据所处的范围确定分类(下标)
使用分段查找,需要先把每一个区间的上限写在一个表中,然后通过循环确定所处的区段,最后获得相应的等级
C#示例 根据分数查绩效等级
















Shinn@cnblogs
2008年4月16日
#原创不易,转载请保留签名
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库