提起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;
相关阅读
文章评论