(原创)[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排序扩展方法的更多相关文章
- EF获取DataTable的扩展方法GetDataSet
微软的EF至今已到了EF6版本了,但是,不知道微软咋想的,至今也不支持直接从数据库获取一张数据表DataTable,但这个DataTable在许多情况下还是比确定的实体化类更方便好使,这里,我仿照微软 ...
- 译:泛型List集合转化为DateTable的扩展方法
译文出处:http://www.codeproject.com/Tips/867866/Extension-Method-for-Generic-List-Collection-to-Da 这段代码是 ...
- Enumerable扩展方法
主要记录一些平时在工作中用到操作Enumerable的常用方法 /// <summary> /// The i enumerable extension. /// </summary ...
- DataTable和DataRow利用反射直接转换为Model对象的扩展方法类
DataTable和DataRow利用反射直接转换为Model对象的扩展方法类 /// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为 ...
- DataTable扩展方法ToList<T>()、ToJSON()、ToArrayList()
/// <summary> /// 扩展方法类 /// </summary> public static class CommonExtension { /// <sum ...
- 在C#中对Datatable排序【DefaultView的Sort方法】
在C#中对Datatable排序,[DefaultView的Sort方法] 代码如下: DataTable dt = new DataTable(); dt.Columns.Add("ID& ...
- C#中DataTable与实体集合通用转换(使用扩展方法)
本案例提供了:把DataRow转换为单个实体.dataTable转换为List泛型支持时间格式转换. 下文的方法都是扩展方法.扩展方法要求写在静态类中,方法也要静态. 它必须在一个非嵌套.非泛型的静态 ...
- c# ef 排序字段动态,构建动态Lambda和扩展方法OrderBy
1.动态构建排序 Lambda /// <summary> /// 获取排序Lambda(如果动态排序,类型不同会导致转换失败) /// </summary> /// < ...
- 写一个针对IQueryable<T>的扩展方法支持动态排序
所谓的动态排序是指支持任意字段.任意升序降序的排序.我们希望在客户端按如下格式写: localhost:8000/api/items?sort=titlelocalhost:8000/api/item ...
随机推荐
- GeoServer Rest服务启动匿名认证的配置方法
GeoServer Rest服务数据默认需要进行用户名.密码的认证,如不需进行该认证,则启动匿名认证即可,配置方式如下(针对war包发布的GeoServer应用): 在GeoServer war包的解 ...
- 一键设置WPS_Office_2019专业版的定时自动备份的批处理文件
一键设置WPS_Office_2019专业版的定时自动备份的批处理文件 rem ================================================ rem 一键设置WPS ...
- 「必知必会」最细致的 ArrayList 原理分析
从今天开始也正式开 JDK 原理分析的坑了,其实写源码分析的目的不再是像以前一样搞懂原理,更重要的是看看他们编码风格更进一步体会到他们的设计思想.看源码前先自己实现一个再比对也许会有不一样的收获! ...
- Java架构师-十项全能学习笔记(1)
Java架构师-十项全能学习笔记(1) @Configuration @EnableStateMachine public class OrderStateMachineConfig extends ...
- SpringBoot+Maven 多模块项目的构建、运行、打包实战
前言 最近在做一个很复杂的会员综合线下线上商城大型项目,单模块项目无法满足多人开发和架构,很多模块都是重复的就想到了把模块提出来,做成公共模块,基于maven的多模块项目,也好分工开发,也便于后期微服 ...
- 免费,好用的天气预报API
不多说直接上! 一.API服务,天气API 网站:http://api.help.bj.cn/api/ 怎么使用网站有很详细的解释 $.ajax({ type: "GET", // ...
- Anaconda创建虚拟环境并使用Jupyter-notebook打开虚拟环境
由于需要使用Tensorflow的1.xx的低版本,但是cmd下载一直报错没有解决,就想着用Anaconda,但是真实环境我已经装上Tensorflow2.0了不想换了,所以就想着再建一个python ...
- MongoDB-03-分片集群
分片集群(Sharding Cluster) 架构图 规划 10个实例:38017-38026 1 configserver:38018-38020 3台构成的复制集(1主两从,不支持arbiter) ...
- 痞子衡嵌入式:i.MXRT中不支持DQS的FlexSPI引脚组连接Flash下载与启动注意事项
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中不支持DQS的FlexSPI引脚组连接Flash下载与启动注意事项. 最近痞子衡在支持一个印度客户,这个客户项目主芯片选择 ...
- Pikachu-Unsafe Fileupload模块
一.概述 文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像.上传附件等等.当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型.后缀名.大小等等,然后将其按照设 ...