(原创)[C#] DataTable排序扩展方法
2021/8/31 22:36:38
本文主要是介绍(原创)[C#] DataTable排序扩展方法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一,前言
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】-
这篇关于(原创)[C#] DataTable排序扩展方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具
- 2024-01-24.NET集成IdGenerator生成分布式全局唯一ID