Datatable 筛选字段并使用distinct筛选唯一值
我想实现如下功能:打开一个datatable之后,它有9个字段,我希望筛选其中4个字段:ABCD,其中有一个字段A有重复值,我需要用distinct去剔除重复值,
而其他字段的值是可以重复的。
我在datatable的函数里找不到相关函数,使用select()函数死活弄不出来,看了网上的帖子也都是相同的问题,才知道:Datatable的select函数相当于
sql语句中的where语句,不能实现我想要的功能。
如果手工去循环弄的话也太麻烦了吧,微软不至于连这么常用的功能都没有实现吧,功夫不负有心人!果然在DataView里找到了。我欣喜若狂!原来DataTable的
筛选字段和Distinct竟如此简单! 狂汗一个!
DataTable dataTable = …; //一个数据表
DataView dataView = dataTable.DefaultView;
DataTable dtnew = dataView.ToTable(“distincttablename”,true,new string[]{ “Field1″,”Field2″,”Field3”,…})
这里面有好几个函数,第一个参数是设置表名称,第二个是否为distinct,第三个参数 我自以为是设置你要显示的是那些字段,可是看了微软的帮助才知道不是!!!!。
//
// 摘要:
// 根据现有 System.Data.DataView 中的行,创建并返回一个新的 System.Data.DataTable。
//
// 参数:
// tableName:
// 返回的 System.Data.DataTable 的名称。
//
// distinct:
// 如果为 true,则返回的 System.Data.DataTable 将包含所有列都具有不同值的行。默认值为 false。
//
// columnNames:
// 一个字符串数组,包含要包括在返回的 System.Data.DataTable 中的列名的列表。DataTable 包含指定的列,其顺序与这些列在该数组中的顺序相同。
//
// 返回结果:
// 一个新的 System.Data.DataTable 实例,其中包含所请求的行和列。
也可以参照这个网址的信息:http://geekswithblogs.net/GinoAbraham/archive/2011/03/29/getting-distinct-column-values-from-a-cdatatable-again.aspx
所以,我只实现了distinct功能,但是在这里我不能实现筛选,问题依然存在!!!只能使用linq了?
自从看到DataView的ToTable这几个函数,我的筛选数据的烦恼立马消失了!haha
dt = dataView.ToTable(false, this.cmbSoil.Text, this.cmbSilt.Text, this.cmbSand.Text, this.cmbOM.Text, this.cmbS.Text, this.cmbP.Text);
DataTable dt2 = dataView.ToTable(true, this.cmbSoil.Text);
//group r by r.Field<string>(this.cmbSoil.Text) group r by new { t1 = r.Field<DateTime>(this.cmbSoil.Text) } where true
// join r2 in dt2.AsEnumerable()
//on r.Field<string>(this.cmbSoil.Text) equals
//r2.Field<string>(this.cmbSoil.Text)
var query =
(
from r2 in dt2.AsEnumerable()
join r in dt.AsEnumerable()
on r2.Field<string>(this.cmbSoil.Text) equals r.Field<string>(this.cmbSoil.Text)
select new{
col1 = r2.Field<string>(this.cmbSoil.Text),
col2 = r.Field<Int32>(this.cmbS.Text)
});
DataTable table = new DataTable();
table.Columns.Add(“Price”, typeof(string));
table.Columns.Add(“Genre”, typeof(string));
// table = query.CopyToDataTable<DataRow>(table,LoadOption.OverwriteChanges);
转载自:https://blog.csdn.net/liuguobo/article/details/23254745