DataTable的应用极其广泛,对DataTable进行排序也有很多方式,每种的实现方式都不难,但是使用起来却比较繁琐,所以本人便写了一个扩展方法,专门对DataTable进行操作。
本篇是使用Linq的方式去实现排序,代码很简单,封装后,使用起来也极其方便。
本扩展方法支持升序/降序排列,支持列以String、Double、Int、Datetime等方式排序。
相信看完的你,一定会有所收获!
本文地址:https://www.cnblogs.com/lesliexin/p/15212026.html
下面直接贴出扩展方法源代码,代码很简单:
using System; using System.Data; using System.Linq; namespace DatatableSortDemo { /// <summary> /// DataTable排序扩展 /// </summary> public static class DatatableSort { /// <summary> /// 排序方式 /// </summary> public enum SortType { /// <summary> /// 升序 /// </summary> ASC, /// <summary> /// 降序 /// </summary> DESC } /// <summary> /// 列的类型 /// </summary> public enum ColumnType { /// <summary> /// String /// </summary> STRING, /// <summary> /// Int /// </summary> INT, /// <summary> /// Double /// </summary> DOUBLE, /// <summary> /// Datetime /// </summary> DATETIME } /// <summary> /// String转Double /// </summary> /// <param name="str"></param> /// <returns></returns> public static double StrToDouble(this string str) { try { var d = Convert.ToDouble(str); return d; } catch (Exception) { return 0; } } /// <summary> /// String转Int /// </summary> /// <param name="str"></param> /// <returns></returns> public static int StrToInt(this string str) { try { var d = str.StrToDouble(); int i = Convert.ToInt32(d); return i; } catch (Exception) { return 0; } } /// <summary> /// String转DateTime /// </summary> /// <param name="str"></param> /// <returns></returns> public static DateTime StrToDatetime(this string str) { try { var d = Convert.ToDateTime(str); return d; } catch (Exception) { return new DateTime(); } } /// <summary> /// String转Object /// </summary> /// <param name="str"></param> /// <param name="colType"></param> /// <returns></returns> public static object StrToObject(this string str,ColumnType colType) { if (colType == ColumnType.STRING) { return str; } else if (colType == ColumnType.DOUBLE) { return str.StrToDouble(); } else if (colType == ColumnType.INT) { return str.StrToInt(); } else { return str.StrToDatetime(); } } /// <summary> /// 排序 /// </summary> /// <param name="dataTable">待排序Datatable</param> /// <param name="colName">排序的列</param> /// <param name="colType">排序列的类型</param> /// <param name="sortType">排序方式</param> /// <returns>排序后的Datetable</returns> public static DataTable Sort(this DataTable dataTable, string colName, ColumnType colType, SortType sortType) { try { if (sortType == SortType.ASC) { var dt = dataTable.Rows.Cast<DataRow>().OrderBy(r => r[colName].ToString().StrToObject(colType)).CopyToDataTable(); return dt; } else { var dt = dataTable.Rows.Cast<DataRow>().OrderByDescending(r => r[colName].ToString().StrToObject(colType)).CopyToDataTable(); return dt; } } catch (Exception) { return null; } } } }
将上面的源码添加到项目中,然后在DataTable后使用即可。
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DatatableSortDemo { class Program { static void Main(string[] args) { DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("A")); dt.Columns.Add(new DataColumn("B")); dt.Columns.Add(new DataColumn("C")); dt.Columns.Add(new DataColumn("D")); dt.Rows.Add("字符串3", "2021-08-31 10:00:00", "1", "45.6"); dt.Rows.Add("字符串2", "2020-08-31 10:00:00", "2", "23.7"); dt.Rows.Add("字符串1", "2019-08-31 10:00:00", "3", "99"); dt.Rows.Add("字符串4", "2021-08-31 11:00:00", "4", "12"); dt.Rows.Add("字符串5", "2021-08-31 10:01:00", "5", "34.5"); var d1 = dt.Sort("A", DatatableSort.ColumnType.STRING, DatatableSort.SortType.ASC); var d1_1 = dt.Sort("A", DatatableSort.ColumnType.STRING, DatatableSort.SortType.DESC); var d2 = dt.Sort("B", DatatableSort.ColumnType.DATETIME, DatatableSort.SortType.ASC); var d2_1 = dt.Sort("B", DatatableSort.ColumnType.DATETIME, DatatableSort.SortType.DESC); var d3 = dt.Sort("C", DatatableSort.ColumnType.INT, DatatableSort.SortType.ASC); var d3_1 = dt.Sort("C", DatatableSort.ColumnType.INT, DatatableSort.SortType.DESC); var d4 = dt.Sort("D", DatatableSort.ColumnType.DOUBLE, DatatableSort.SortType.ASC); var d4_1 = dt.Sort("D", DatatableSort.ColumnType.DOUBLE, DatatableSort.SortType.DESC); Console.WriteLine("按列A正序:"); DatatablePrint(d1); Console.WriteLine("按列A倒序:"); DatatablePrint(d1_1); Console.WriteLine("--------------------"); Console.WriteLine("按列B正序:"); DatatablePrint(d2); Console.WriteLine("按列B倒序:"); DatatablePrint(d2_1); Console.WriteLine("--------------------"); Console.WriteLine("按列C正序:"); DatatablePrint(d3); Console.WriteLine("按列C倒序:"); DatatablePrint(d3_1); Console.WriteLine("--------------------"); Console.WriteLine("按列D正序:"); DatatablePrint(d4); Console.WriteLine("按列D倒序:"); DatatablePrint(d4_1); Console.WriteLine("--------------------"); Console.ReadKey(); } static void DatatablePrint(DataTable dt) { string s = ""; int iColCount = dt.Columns.Count; foreach( DataColumn col in dt.Columns) { s += col.ColumnName + "\t"; } Console.WriteLine(s); foreach (DataRow row in dt.Rows) { s = ""; for(int i=0;i< dt.Columns.Count; i++) { s += row[i].ToString() + "\t"; } Console.WriteLine(s); } } } }
运行结果如下,排序都正确的。
-【END】-