提起DataTable这个对象,可能工作1-2年的小伙伴都不知道,它其实是ado.net时代的产物,用于连接数据库返回列表数据,因为现在都用ORM框架,DataTable用得越来越少。不过,它其实还是很用的,今天分享下它的一些常用操作
1、DataTable转List<T>
DataTable属于弱类型对象,虽然适用性很强,但不能用Linq。因此需要把它转成List<T>,Linq操作的性能要好得多,也方便。推荐使用
//1,DataTable转List<T> DataTable dt1 = new DataTable(); dt1.Columns.Add("id", typeof(int)); dt1.Columns.Add("name", typeof(string)); dt1.Columns.Add("ctime", typeof(DateTime)); for (int i = 1; i <= 20; i++) { dt1.Rows.Add(new object[] { 1, "name_" + i.ToString(), DateTime.Now }); } List<PersonModel> list1 = DataTableHelper.GetListByDataTable<PersonModel>(dt1); int count1 = list1.Count; //结果:20
2、List<T>转DataTable
有时也需要反过来操作,比如Winform控件中的DataSource,是用DataTable对象赋值的
//2,List<T>转DataTable List<PersonModel> list2 = new List<PersonModel>(); for(int i = 1; i < 20; i++) { list2.Add(new PersonModel() { id = i, name = "name-" + i.ToString(), ctime = DateTime.Now, }); } DataTable dt2 = DataTableHelper.GetTableByList<PersonModel>(list2); int rowCount2 = dt2.Rows.Count;
3、字符串快速生成DataTable
这个场景一般用于生成控件的DataSource数据源
//3,字符串快速生成DataTable DataTable dt3 = DataTableHelper.GetTableByString("zhangs,张三|lis,李四|wangw,王五|zhaol,赵六"); int rowCount3 = dt3.Rows.Count;
4、实现DataTable的分组
就是Sql里的Distinct函数,保持数据的唯一性
//4,实现DataTable的分组 DataTable dt4 = new DataTable(); dt4.Columns.Add("user_id", typeof(string)); dt4.Columns.Add("user_name", typeof(string)); dt4.Rows.Add(new object[] { "zhangs", "张三" }); dt4.Rows.Add(new object[] { "zhangs", "张三" }); dt4.Rows.Add(new object[] { "lis", "李四" }); dt4.Rows.Add(new object[] { "lis", "李四" }); int rowCount4 = dt4.Rows.Count; //结果:4 DataTable dt42 = DataTableHelper.GetTableByDistinct(dt4, new string[] { "user_id", "user_name" }); int rowCount42 = dt42.Rows.Count; //结果:2
5、四则运算
直接看代码就行了,很简单吧
//5,四则运算 DataTable dt5 = new DataTable(); dt5.Columns.Add("id", typeof(string)); dt5.Rows.Add(new object[] { "id_value" }); string formula = "1+2*3-4"; object objR5 = dt5.Compute(formula, ""); decimal decR5 = Math.Round(Convert.ToDecimal(objR5), 6);
6、DataSet和字符串互转
直接使用WriteXml(fileName),如果包含中文字符串,会乱码,需要用Stream中转下
//6,DataSet和字符串互转 DataTable dt6 = new DataTable(); dt6.Columns.Add("user_id", typeof(string)); dt6.Columns.Add("user_name", typeof(string)); dt6.Rows.Add(new object[] { "zhangs", "张三" }); dt6.Rows.Add(new object[] { "lis", "李四" }); DataSet dset6 = new DataSet(); dset6.Tables.Add(dt6.Copy()); //6.1,DataSet转字符串 //(屏蔽,原因:中文会乱码) //dset6.WriteXml(@"d:\dset6.xml"); StringWriter sw6 = new StringWriter(); dset6.WriteXml(sw6); string sData6 = sw6.ToString(); //6.2,字符串转DataSet StringReader sr6 = new StringReader(sData6); DataSet dset63 = new DataSet(); dset63.ReadXml(sr6);
7、DataRow[]生成DataTable
以前是循环DataRow[],New个新DataRow,ItemArray接收下;现在可以一句话搞定
//7,DataRow[]转DataTable DataTable dt7 = new DataTable(); dt7.Columns.Add("id", typeof(int)); dt7.Columns.Add("name", typeof(string)); dt7.Columns.Add("ctime", typeof(DateTime)); for (int i = 1; i <= 20; i++) { dt7.Rows.Add(new object[] { i, "name_" + i.ToString(), DateTime.Now }); } DataRow[] dr7s = dt7.Select("id < 10"); //7.1,常用方法 DataTable dt72 = dt7.Clone(); foreach(DataRow dr7 in dr7s) { DataRow drAdd = dt72.NewRow(); drAdd.ItemArray = dr7.ItemArray; dt72.Rows.Add(drAdd); } int rowCount72 = dt72.Rows.Count; //结果:9 //7.2,高效的方法 DataTable dt73 = dr7s.CopyToDataTable(); int rowCount73 = dt73.Rows.Count; //结果:9
8,DataColumn也可以自增量
可以模拟数据库的表
//8,DataColumn也可以自增量 dt7.Columns["id"].AutoIncrement = true;
相关阅读
文章评论