让工具类为小弟我所用—去除集合中重复属性值
1. 什么是工具类
在日常的开发过程中,有的时候我们会将公共的东西比如说类或者说是方法进行抽象和封装,这些封装可能是基于一个项目或者说是几个项目来的。
光说概念大家可能很难有个清晰的概念,详细做过c/s项目的都接触过SQLhelper,它就是一个工具类,更确切的说是数据库链接工具类,它将对数据库链接的操作进行了封装,这样需要进行数据库链接的时候只需要调用这个类就可以了。这样就大大提高了我们编程速度以及代码的质量,避免的代码的重复,提高了代码的利用率。
2. 使用的好处
工具类简单言之就是对类或者公用方法的代码进行封装和抽象,以达到通用的目的,封装了很多重复使用的或者比较常用的方法,我们最最常见的就是SQLHelper。
这里的摘抄网上的一个例子:
<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; using MySQLDriverCS; using System.Data; namespace Demo { class SqlHelper { private static string server = ConfigurationManager.ConnectionStrings[server].ConnectionString; private static string database = ConfigurationManager.ConnectionStrings[database].ConnectionString; private static string login = ConfigurationManager.ConnectionStrings[login].ConnectionString; private static string password = ConfigurationManager.ConnectionStrings[password].ConnectionString; public static int ExecuteNoQuery(String sql,MySQLParameter[] parameters) { using (MySQLConnection conn = new MySQLConnection(new MySQLConnectionString(server, database, login, password).AsString)) { conn.Open(); //防止乱码 MySQLCommand commn = new MySQLCommand(set names gb2312, conn); commn.ExecuteNonQuery(); //连接语句和SQL MySQLCommand cmd = new MySQLCommand(sql, conn); //添加参数 cmd.Parameters.AddRange( parameters); //返回执行结果 return cmd.ExecuteNonQuery(); } } public static object ExecuteScalar(String sql, MySQLParameter[] parameters) { using (MySQLConnection conn = new MySQLConnection(new MySQLConnectionString(server, database, login, password).AsString)) { conn.Open(); //防止乱码 MySQLCommand commn = new MySQLCommand(set names gb2312, conn); commn.ExecuteNonQuery(); MySQLCommand cmd = new MySQLCommand(sql, conn); //添加参数 cmd.Parameters.AddRange(parameters); return cmd.ExecuteNonQuery(); } } //较少的时候 public static DataTable ExecuteReaderEx(String sql, MySQLParameter[] parameters) { using (MySQLConnection conn = new MySQLConnection(new MySQLConnectionString(server, database, login, password).AsString)) { conn.Open(); //防止乱码 MySQLCommand commn = new MySQLCommand(set names gb2312, conn); commn.ExecuteNonQuery(); MySQLCommand cmd = new MySQLCommand(sql, conn); //添加参数 cmd.Parameters.AddRange(parameters); MySQLDataAdapter mda = new MySQLDataAdapter(cmd); //查询出的数据是存在DataTable中的,DataTable可以理解成为一个虚拟的表,DataTable中的一行为一条记录,一列为一个数据库字段 DataTable dt = new DataTable(); mda.Fill(dt); return dt; } } public static DataSet ExecuteReaderEx2(String sql, MySQLParameter[] parameters) { using (MySQLConnection conn = new MySQLConnection(new MySQLConnectionString(server, database, login, password).AsString)) { conn.Open(); //防止乱码 MySQLCommand commn = new MySQLCommand(set names gb2312, conn); commn.ExecuteNonQuery(); MySQLCommand cmd = new MySQLCommand(sql, conn); //添加参数 cmd.Parameters.AddRange(parameters); MySQLDataAdapter mda = new MySQLDataAdapter(cmd); //查询出的数据是存在DataTable中的,DataTable可以理解成为一个虚拟的表,DataTable中的一行为一条记录,一列为一个数据库字段 DataSet ds = new DataSet(); mda.Fill(ds); return ds; } } } }</strong></span>
3. 项目中的应用
在做高校云平台中过程中,遇到了一个技术的难点,就是如何将获取到集合中重复的属性进行去除,可能大家没有理解我的意思。
下面我来详细说说。
在查询学生的平时成绩的时候,我们知道一个学生的平时成绩再一个学年里是存在多条的,那么一个学生的平均成绩我们可以采用平均成绩的方法来求得。
<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>//将平时成绩同时求平均值后添加进入总成绩的表中 List<ResultUsualScoreViewModel> lisUs = new List<ResultUsualScoreViewModel>(); lisUs = studentUsusInfo.QueryUsualBySchoolYear(yearId); </strong></span>
如果按照上面的只是根据学年进行查询,然后对得到的集合进行遍历,我们可以想象出来我们做了很多不应该的集合,对于同一个学生,我们只是需要一次遍历即可。
此时我们需要做的就如何根据集合中的属性值相同的进行过滤也即是去除重复,这里我们需要用到一个工具类:
<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>#region FilterRepeat 工具类---------过滤一个集合中具有相同属性的集合,保持一致性,就像数据库中的distinct //工具类---------过滤一个集合中具有相同属性的集合,保持一致性,就像数据库中的distinct public IList<T> FilterRepeat<T>(IList<T> t, string attName) { if (t.Count <= 0) return t; #region 查找attName所在的位置 int index = -1; for (int i = 0; i < t[0].GetType().GetProperties().Count(); i++) { if (t[0].GetType().GetProperties()[i].Name == attName) { index = i; break; } } #endregion if (index == -1) return t; IList<T> result = new List<T>(); var sr = from s in t group s by s.GetType().GetProperties()[index].GetValue(s, null); foreach (var group in sr) result.Add(group.ToList()[0]); return result; } #endregion</strong></span>
我们将需要进行属性值过滤的集合直接用这个方法即可实现。将上述得到的集合进行过滤得到下面的集合(根据是属性是学号)
<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>lisUs = (List<ResultUsualScoreViewModel>)this.FilterRepeat<ResultUsualScoreViewModel>(lisUs, "studentNo");</strong></span>
这样便可以实现我们最终想要的结果,是不是很方便啊。这样的思路会给我们的开发带来一定的灵感,比如说我们也是可以自己进行一些公用方法的封装的,但是抽象和封装是有前提的,
1. 因为方法是公用的,通用的,那么必然不能涉及到业务逻辑。
2. 不同的功能抽象针对与不同的实现,工具类是根据自己的目的不同而不同,比如说有链接数据库的sqlhelper类,同样也有去除集合重复的FilterRepeat<T>方法,当然也有将dataset类型的结果集转换为json格式的DataSetToJson方法等等。
3. 必要的注释,因为这个是公用的东西,那么肯定会为很多人所共享,这样只有良好的注释习惯才能使得大家都能够共享。
善于运用工具类将会大大地方便我们的开发。
版权声明:本文为博主原创文章,未经博主允许不得转载。