C#对DataTable里数据筛选排序的方法

发布时间:2021-10-14编辑:佚名阅读(1132)

在日常开发过程中,有一个DataTable集合,里面有很多字段,现在要求针对某一列进行排序,如果该列为数字的话,进行ASC即可实现,但是该字段类型为string,此时排序就有点不正确了。

protected void Page_Load(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Name");
        dt.Columns.Add("Age");//因为是字符串,所以排序不对
        dt.Rows.Add("小明", "21");
        dt.Rows.Add("小张", "10");
        dt.Rows.Add("小红", "9");
        dt.Rows.Add("小伟", "7");
        dt.Rows.Add("小美", "3");
        dt.DefaultView.Sort = "Age ASC";
        dt = dt.DefaultView.ToTable();
        foreach (DataRow s in dt.Rows)
        {
            Response.Write(s["Age"].ToString() + "--" + s["Name"].ToString() + "<br/>");
        }
        Response.Write("------------------1----------------<br/>");
 
        #region 方法1:将年龄补齐为2位,然后再进行排序,但是实际不应该有0(仅作参考)
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            dt.Rows[i]["Age"] = dt.Rows[i]["Age"].ToString().PadLeft(2, '0');
        }
        dt.DefaultView.Sort = "Age ASC";
        dt = dt.DefaultView.ToTable();
        foreach (DataRow s in dt.Rows)
        {
            Response.Write(s["Age"].ToString() + "--" + s["Name"].ToString() + "<br/>");
        }
        #endregion
        Response.Write("------------------2----------------<br/>");
        #region 方法2:创建新的DataTable,将Age类型变更为int类型
        DataTable dtNew = dt.Clone();
        dtNew.Columns["Age"].DataType = typeof(int);//指定Age为Int类型
        foreach (DataRow s in dt.Rows)
        {
            dtNew.ImportRow(s);//导入旧数据
        }
        dtNew.DefaultView.Sort = "Age ASC";
        dtNew = dtNew.DefaultView.ToTable();
        foreach (DataRow s in dtNew.Rows)
        {
            Response.Write(s["Age"].ToString() + "--" + s["Name"].ToString() + "<br/>");
        }
        #endregion
        Response.Write("-----------------3-----------------<br/>");
        #region 方法3:添加一列,主要用于排序
        dt.Columns.Add("AgeLength", typeof(int), "len(Age)");//添加该列时,DataTable列数据即生成
        dt.DefaultView.Sort = "AgeLength,Age ASC";
        dt = dt.DefaultView.ToTable();
        foreach (DataRow s in dt.Rows)
        {
            Response.Write(s["Age"].ToString() + "--" + s["Name"].ToString() + "<br/>");
        }
        #endregion
        Response.Write("-----------------4-----------------<br/>");
        #region 方法4:运用LinQ,将DataTable转换为集合,再调用集合自带的排序方法进行排序
        foreach (DataRow s in dt.Rows.Cast<DataRow>().OrderBy(r => int.Parse(r["Age"].ToString())))
        {
            Response.Write(s["Age"].ToString() + "--" + s["Name"].ToString() + "<br/>");
        }
        #endregion
    }

DataTable dataTable;

    1、排序
    1.1、利用查询排序

DataRow[] dataRows = dataTable.Select("条件", "id asc");
//或多列排序
DataRow[] dataRows = dataTable.Select("条件", "id asc,name asc,...");
//对所有的进行排序
DataRow[] dataRows = dataTable.Select("1=1", "id asc,name asc,...");

    1.2、默认视图排序

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

    2、搜索(注意如果条件是字符串要加单引号

    如果单纯搜索,

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

如果对搜索结果排序,如同1.1。

     说明:select方法如同sql语句对单表的查询,条件如同sql语句的where之后的部分,>,<,=,LIKE等都可以使用。
    3、合并
    合并的对象必须结构要一致,如果不一致先转换一致。然后,利用Merge方法,

DataTable dataTable1 = null;
DataTable dataTable2 = null;
dataTable1.Merge(dataTable2);


  关键字:C#DataTable数据筛选排序方法


鼓掌

0

正能量

0

0

呵呵

0


评论区