DataTable--可能你不知道的一些功能(排序、查询、合并操作)

        写在前面的:

        本来是想写一些关于串口线程的东西的。但是由于自己现在处于项目开发的阶段。最近随着自己对这个项目的不断的认识,以及对出现的问题的不断的研究与学习。发现自己对串口中线程的应用的理解有所偏差。本着对读者负责的原则。我决定推迟对这块研究成果的发表。先说一些在我的项目中也是比较的重要的知识点。

        今天要给大家说是关于DataTable的一些比较少用的功能,我们所用到的DataTable,通常是作为从数据库中查的的返回的结果;或者是在代码中自己新建的DataTable,手动的然后添加一些数据,作为程序中的一个数据仓库进行处理、传递。今天要给大家讲的当然也是对于DataTable的一些操作,当然也是一些比较常用的操作。但我的这篇文章一定对大多数人来说,是非常受益的。

      进入正文:

一、Merge方法:

        在内存中将两个DataTable合并,存在两种情况1>.表结构相同。2>.表结构不同。

           1>.表结构相同

        如果两个表的表结构相同则将这两个表的数据合并。

	DataTable dt1 = new DataTable(); 
	dt1.Columns.Add("student_no");
	dt1.Columns.Add("student_name");
	dt1.Rows.Add("001", "June");
	dt1.Rows.Add("002", "zhang");
	dt1.Rows.Add("003", "jun");
	DataTable dt2 = new DataTable(); 
	dt2 .Columns.Add("student_no");
	dt2 .Columns.Add("student_name");
	dt2 .Rows.Add("111", "ABC");
	dt2 .Rows.Add("222", "XYZ");
	dt2 .Rows.Add("333", "OPQ");
	DataTable dt3 = dt1.Copy(); 
	dt3.Merge(dt2);

    dt3的表内数据为:


2>.表结构不同:

    如果两个表的表结构不同但有相同的主键。则执行两个表的连接类似jone

	DataTable dt1 = new DataTable(); 
	dt1.Columns.Add( "ID", typeof(int)); 
	dt1.Columns.Add( "Name", typeof(string)); 
	dt1.PrimaryKey = new DataColumn[] { dt1.Columns[0]}; 
	dt1.Rows.Add(1, "Age "); 
	dt1.Rows.Add(2, "Apple "); 
	dt1.Rows.Add(3, "Orange "); 
	
	DataTable dt2 = new DataTable(); 
	dt2.Columns.Add( "ID", typeof(int)); 
	dt2.Columns.Add( "Price", typeof(decimal)); 
	dt2.PrimaryKey = new DataColumn[] { dt2.Columns[0] }; 
	dt2.Rows.Add(1, 10); 
	dt2.Rows.Add(2, 6); 
	dt2.Rows.Add(3, 7); 
	
	DataTable dt3 = dt1.Copy(); 
	dt3.Merge(dt2);

    dt3的表内数据为:



    如果dt2中没有dt1中对应的数据,如id为2的数据为空,则结果为:


二、查找Select

    对于大部分人来说使用Select方法,好像都面对的数据库,对数据库中的数据进行查询。而我们常说DataTable是在内存中的一张表,我们当然能对他进行操作了。

	DataRow[] dataRows = dataTable.Select("条件");

    注意DataTableSelect函数中我们需要提供的是我们的查询条件。即我们通常写sql语句中的Where后的语句。如对上面的操作最后加上

	DataRow[] dataRows = dt3.Select("ID =1");
	string str = dataRows[0]["Price"].ToString();
	MessageBox.Show(str);


         实现的结果:


    当然也可以在筛选条件中传入参数:

	int id; 
	string name;
	DataRow[] dataRows = dataTable.Select(string.Format(@"id={0} and name={1}",id,name));

三、排序

    当然你可能会说在获取DataTable之前,先排序后填充,但是往往有些时候是不能做到这一点的。这时候,就用到了DataTable的排序。

1>.利用查询排序

	DataRow[] dataRows = dataTable.Select("条件", "id asc"); //一列排序
	DataRow[] dataRows = dataTable.Select("条件", "id asc,name asc,..."); //或多列排序 
	DataRow[] dataRows = dataTable.Select("恒为True的表达式,如1=1", "id asc,name asc,...");//对所有的进行排序 

    说明:

  1. select方法如同sql语句对单表的查询,条件如同sql语句的where之后的部分,>,<,=,LIKE等都可以使用。
  2. “ASC”(升序)或“DESC”(降序)

    如在上面查找的代码中加入:

 DataRow[] dataRows = dt3.Select("ID >0", "ID desc");
            string str = dataRows[0]["Price"].ToString();
            MessageBox.Show(str);

实现的结果:


2>.默认视图排序:使用DataViewSort属性

    作用:获取或设置 DataView的一个或多个排序列以及排序顺序。

    属性:一个字符串,它包含列名,后跟“ASC”(升序)或“DESC”(降序)。在默认情况下列按升序排序。多个列可用逗号隔开。

	DataView dataView = dataTable.DefaultView;
	dataView.Sort = "id desc";
	dataTable = dataView.ToTable();

实现的结果:


         Totable方法:就是把视图重新转换为DataTable

 

3>.另外说明DataView的另一个很重要的属性RowFilter

    作用:使用RowFilter属性动态筛选记录,从DataTable对象中获取符合该属性指定条件的数据作为DataView对象的数据,若不设置该项,则获取DataTable对象中的所有数据作为DataView对象中的数据。

RowFilter中的查询语句与前面介绍过的DataTable对象的SELECT()方法的语法一致。例如:

dataView.RowFilter = "ID =1'";


  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
对于DataTable排序,可以使用DefaultView的Sort方法。首先,需要获取DataTable的DefaultView,然后设置得到的DefaultView的Sort属性来指定排序的列和排序方式。比如,可以使用以下代码对DataTable进行排序: ```csharp DataTable dataTable = new DataTable(); // 假设DataTable已经有数据 // ... // 获取DataTable的DefaultView DataView dataView = dataTable.DefaultView; // 设置排序属性 dataView.Sort = "列名 ASC/DESC"; // 使用排序后的DataView进行操作 foreach (DataRowView rowView in dataView) { // 操作每一行数据 } ``` 另外,还可以通过使用Select方法来筛选和排序数据。使用Select方法可以根据指定的筛选条件和排序方式来获取符合条件的行,并将它们复制到一个DataTable中。比如,可以使用以下代码对DataTable进行排序: ```csharp DataTable dataTable = new DataTable(); // 假设DataTable已经有数据 // ... // 使用Select方法筛选和排序数据 DataRow[] rows = dataTable.Select("", "列名 ASC/DESC"); DataTable sortedTable = dataTable.Clone(); sortedTable.Clear(); foreach(DataRow row in rows) { sortedTable.ImportRow(row); } // 使用排序后的DataTable进行操作 foreach(DataRow row in sortedTable.Rows) { // 操作每一行数据 } ``` 这些方法可以实现对DataTable排序,根据具体的需求选择适合的方法进行排序操作即可。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C#实现Datatable排序的方法](https://download.csdn.net/download/weixin_38670186/13781913)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [DataTable 排序](https://blog.csdn.net/ranbolwb/article/details/7278011)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值