我最近做一个复杂的报表,需要将系统中很多表的数据,都集中显示在这个报表中。报表的项目跟系统表的项目名称不一样,但是又是一一对应的,比如报表项目“身高m”,在系统里面叫“身高”。将系统数据查询出来,并赋值到报表的时候,我用到了if语句,如下代码所示:
private void AddLisItems(List<string> list)
{
//插入基本项目信息
DataSet dsLisItems = null;
this.dtLisItems.Rows.Clear();//先全部清空
foreach (string s in list)
{
dsLisItems = logic.GetBaseChkItems(s);
if (dsLisItems != null)
{
DataRow drB = this.dtLisItems.NewRow();
drB["流水号"] = s;
foreach (DataRow dr in dsLisItems.Tables[0].Rows)
{
if (dr["checkitem_name"].ToString() == "身高")
{
drB["身高m"] = dr["chk_result"];
}
else if (dr["checkitem_name"].ToString() == "体重")
{
drB["体重kg"] = dr["chk_result"];
}
else if (dr["checkitem_name"].ToString() == "血压")
{
string result = dr["chk_result"].ToString();
if (result.Contains("/"))
{
drB["收缩压"] = result.Substring(0, result.IndexOf("/"));
drB["舒张压"] = result.Substring(result.IndexOf("/") + 1);
}
else
{
drB["收缩压"] = result;
drB["舒张压"] = result;
}
}
else if (dr["checkitem_name"].ToString() == "左眼裸视力")
{
drB["左眼"] = dr["chk_result"];
}
else if (dr["checkitem_name"].ToString() == "右眼裸视力")
{
drB["右眼"] = dr["chk_result"];
}
else if (dr["checkitem_name"].ToString() == "肺活量")
{
drB["肺活量"] = dr["chk_result"];
}
this.dtLisItems.Rows.Add(drB);
}
}
}
真的很多if-else的判断,我列出来的项目只有5个,用这种方式写还不算复杂。但是,我的报表有50多个项目需要进行这样的if判断,那一个简单的需求,不是要写很多超级多的代码。这种感觉真的很糟糕,维护起来也会很复杂,单步执行调试就够头大的了。
那我用什么办法改进呢?我想到了数据字典,使用数据字典改写这个if判断。我先讲需要对照的项目保存在数据表里面,如下图所示:
因为左边的项目是不会重复的,这样就可以当做字典的键值,右边的项目就是报表的值了,我们不需要对照的判断,只是需要判断键值存不存在就OK了,
string item = dr["checkitem_name"].ToString();
string result = dr["chk_result"].ToString();
if (dicCompare.ContainsKey(item))
{
if (dicCompare[item].Contains(","))
{
string[] temps = dicCompare[item].Split(new char[] { ',' });
if (result.Contains("/"))
{
drB[temps[0]] = result.Substring(0, result.IndexOf("/"));
drB[temps[1]] = result.Substring(result.IndexOf("/") + 1);
}
else
{
drB[temps[0]] = result;
drB[temps[1]] = result;
}
}
else
{
drB[dicCompare[item]] = result;
}
}
}
如何改写呢?
(1)创建字典
我将要对照的数据写入数据表compare_info中,在例子中,我把上图中左边列当作键,右边当作值;在初始化的时候,我就先查询系统的compare_info表,创建字典dictionary。
(2)使用键,查找对应的值
dicCompare[item]这个值就是报表的值