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

                DataView dataView = dtTable.DefaultView;
                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

You may also like...