C#对DataTable里数据进行排序
在日常开发过程中,有一个DataTable集合,里面有很多字段,现在要求针对某一列进行排序,如果该列为数字的话,进行ASC即可实现,但是该字段类型为string,此时排序就有点不正确了
1 protected void Page_Load(object sender, EventArgs e) 2 { 3 DataTable dt = new DataTable(); 4 dt.Columns.Add("Name"); 5 dt.Columns.Add("Age");//因为是字符串,所以排序不对 6 dt.Rows.Add("小明", "21"); 7 dt.Rows.Add("小张", "10"); 8 dt.Rows.Add("小红", "9"); 9 dt.Rows.Add("小伟", "7"); 10 dt.Rows.Add("小美", "3"); 11 dt.DefaultView.Sort = "Age ASC"; 12 dt = dt.DefaultView.ToTable(); 13 14 foreach (DataRow s in dt.Rows) 15 { 16 Response.Write(s["Age"].ToString() + "--" + s["Name"].ToString() + "<br/>"); 17 } 18 Response.Write("------------------1----------------<br/>"); 19 20 21 #region 方法1:将年龄补齐为2位,然后再进行排序,但是实际不应该有0(仅作参考) 22 for (int i = 0; i < dt.Rows.Count; i++) 23 { 24 dt.Rows[i]["Age"] = dt.Rows[i]["Age"].ToString().PadLeft(2, '0'); 25 } 26 dt.DefaultView.Sort = "Age ASC"; 27 28 dt = dt.DefaultView.ToTable(); 29 30 foreach (DataRow s in dt.Rows) 31 { 32 Response.Write(s["Age"].ToString() + "--" + s["Name"].ToString() + "<br/>"); 33 } 34 #endregion 35 36 Response.Write("------------------2----------------<br/>"); 37 38 #region 方法2:创建新的DataTable,将Age类型变更为int类型 39 DataTable dtNew = dt.Clone(); 40 dtNew.Columns["Age"].DataType = typeof(int);//指定Age为Int类型 41 foreach (DataRow s in dt.Rows) 42 { 43 dtNew.ImportRow(s);//导入旧数据 44 } 45 46 dtNew.DefaultView.Sort = "Age ASC"; 47 dtNew = dtNew.DefaultView.ToTable(); 48 49 foreach (DataRow s in dtNew.Rows) 50 { 51 Response.Write(s["Age"].ToString() + "--" + s["Name"].ToString() + "<br/>"); 52 } 53 #endregion 54 55 Response.Write("-----------------3-----------------<br/>"); 56 57 #region 方法3:添加一列,主要用于排序 58 dt.Columns.Add("AgeLength", typeof(int), "len(Age)");//添加该列时,DataTable列数据即生成 59 60 dt.DefaultView.Sort = "AgeLength,Age ASC"; 61 dt = dt.DefaultView.ToTable(); 62 63 foreach (DataRow s in dt.Rows) 64 { 65 Response.Write(s["Age"].ToString() + "--" + s["Name"].ToString() + "<br/>"); 66 } 67 #endregion 68 69 Response.Write("-----------------4-----------------<br/>"); 70 71 #region 方法4:运用LinQ,将DataTable转换为集合,再调用集合自带的排序方法进行排序 72 foreach (DataRow s in dt.Rows.Cast<DataRow>().OrderBy(r => int.Parse(r["Age"].ToString()))) 73 { 74 Response.Write(s["Age"].ToString() + "--" + s["Name"].ToString() + "<br/>"); 75 } 76 #endregion 77 }
转:http://www.jb51.net/article/43343.htm