一,前言

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排序扩展方法的更多相关文章

  1. EF获取DataTable的扩展方法GetDataSet

    微软的EF至今已到了EF6版本了,但是,不知道微软咋想的,至今也不支持直接从数据库获取一张数据表DataTable,但这个DataTable在许多情况下还是比确定的实体化类更方便好使,这里,我仿照微软 ...

  2. 译:泛型List集合转化为DateTable的扩展方法

    译文出处:http://www.codeproject.com/Tips/867866/Extension-Method-for-Generic-List-Collection-to-Da 这段代码是 ...

  3. Enumerable扩展方法

    主要记录一些平时在工作中用到操作Enumerable的常用方法 /// <summary> /// The i enumerable extension. /// </summary ...

  4. DataTable和DataRow利用反射直接转换为Model对象的扩展方法类

    DataTable和DataRow利用反射直接转换为Model对象的扩展方法类   /// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为 ...

  5. DataTable扩展方法ToList<T>()、ToJSON()、ToArrayList()

    /// <summary> /// 扩展方法类 /// </summary> public static class CommonExtension { /// <sum ...

  6. 在C#中对Datatable排序【DefaultView的Sort方法】

    在C#中对Datatable排序,[DefaultView的Sort方法] 代码如下: DataTable dt = new DataTable(); dt.Columns.Add("ID& ...

  7. C#中DataTable与实体集合通用转换(使用扩展方法)

    本案例提供了:把DataRow转换为单个实体.dataTable转换为List泛型支持时间格式转换. 下文的方法都是扩展方法.扩展方法要求写在静态类中,方法也要静态. 它必须在一个非嵌套.非泛型的静态 ...

  8. c# ef 排序字段动态,构建动态Lambda和扩展方法OrderBy

    1.动态构建排序 Lambda /// <summary> /// 获取排序Lambda(如果动态排序,类型不同会导致转换失败) /// </summary> /// < ...

  9. 写一个针对IQueryable<T>的扩展方法支持动态排序

    所谓的动态排序是指支持任意字段.任意升序降序的排序.我们希望在客户端按如下格式写: localhost:8000/api/items?sort=titlelocalhost:8000/api/item ...

随机推荐

  1. Selenium3自动化测试【20】CSS定位元素

    CSS 指层叠样式表 (CascadingStyleSheets),CSS一种用来表现HTML或XML等文件样式的计算机语言,其能够灵活的为页面提供丰富样式的风格. CSS使用选择器为页面元素绑定属性 ...

  2. 每天五分钟Go - Map

    map的定义 var m map[type]type fmt.Println(m) 此种方法定义的m为nil //打印的结果为: map[] map的创建 1.使用make创建 var m1 = ma ...

  3. Error:Connection activation failed: No suitable device found for this connection 问题最新解决方案

    虽然网上有很多关于这个问题的解决方案,但是我还是决定自己再次重复写一下这个解决的方案,重在更新知识和了解VMware workstation 15新功能. 在使用VMware workstation克 ...

  4. synchronized锁定类方法、volatile关键字及其他(八)

    同步静态方法 synchronized还可以应用在静态方法上,如果这么写,则代表的是对当前.java文件对应的Class类加锁.看一下例子,注意一下printC()并不是一个静态方法: public ...

  5. [HNOI]2011卡农

    这是一道很好的组合数学题. 对于和我一样五音里面有六音不全的人来说,我们就应该转换一下题目的意思: 一句话题意: 题目的意思就是说要从一个有 n 个元素的集合当中选出一个长度为m的集合,然后满足: 1 ...

  6. python里面的垃圾回收机制

    文章链接:https://www.jianshu.com/p/1e375fb40506 Garbage collection(GC) 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c ...

  7. python虚拟环境之Pyenv

    一.windows下安装 1.使用命令安装 pip install pyenv-win --target %USERPROFILE%/.pyenv %USERPROFILE%/是具体的路径,例如 ## ...

  8. endnote x9.3.3 for windows安装教程

    EndNote X9.3.3 是一款非常nice的实用型文献管理软件,EndNote X9功能极其强劲,便捷好用.本文提供EndNote X9.3.3安装破解激活教程.方法,内附EndNote x9. ...

  9. VUE SpringCloud 跨域资源共享 CORS 详解

    VUE  SpringCloud 跨域资源共享 CORS 详解 作者:  张艳涛 日期: 2020年7月28日 本篇文章主要参考:阮一峰的网络日志 » 首页 » 档案 --跨域资源共享 CORS 详解 ...

  10. shiro反序列化550、721

    shiro550反序列化 获取docker镜像 docker pull medicean/vulapps:s_shiro_1 重启docker systemctl restart docker 启动d ...