一,前言

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. 第三篇--如何修改exe文件版本号和文件信息

    控制台程序添加版本信息方法: 项目右键 Add-->Resource-->选择Version-->new,然后就可以修改里面的信息了,重新编译一下就OK.

  2. protobuf基础类以及python 转换pb2.py文件

    一 protobuf-前端解析js 前端解析思路: 1.问后端要数据模型文件,比如名为MODEL.proto 2.使用谷歌官方的工具生成MODEL.js 3.把项目中引用的MODEL.js 和谷歌官方 ...

  3. Python - 可变和不可变对象

    前置知识 在 Python 中,一切皆为对象 Python 中不存在值传递,一切传递的都是对象的引用,也可以认为是传址 有哪些可变对象,哪些不可变对象? 不可变对象:字符串.元组.数字(int.flo ...

  4. mysql采坑笔记

    mysqld --initialize-insecure // 初始化数据 mysql -u root -p // 登录 navicat for mysql 1251错误解决方法 ALTER USER ...

  5. js学习笔记之日期倒计时DOM操作

    1.访问html元素 getElementById() 方法  返回对拥有指定 id 的第一个对象的引用,只有dom对象有效 getElementsByName() 方法  返回指定名称的对象集合 g ...

  6. 论文笔记:(CVPR2019)Relation-Shape Convolutional Neural Network for Point Cloud Analysis

    目录 摘要 一.引言 二.相关工作 基于视图和体素的方法 点云上的深度学习 相关性学习 三.形状意识表示学习 3.1关系-形状卷积 建模 经典CNN的局限性 变换:从关系中学习 通道提升映射 3.2性 ...

  7. Hadoop 3.1.1 - Yarn 服务 - 总览

    YARN 服务 总览 Yarn 服务框架为在 Yarn 原生环境里长时间运行的服务,提供了一流的支持和接口.简言之,它扮演了容器编排系统的角色,统一管理 Yarn 上运行的容器化服务.它同时支持 Do ...

  8. Bugku-web-字符?正则?

    题目意思很明显,根据给出的规则构造出合理的正则表达式然后通过get方式提交弹出Flag. i:字体大小 /..../表示开始和结束. .号表示匹配0-9任一数字 *号表示重复前一个字符多次 {4,7} ...

  9. Git8.3k星,十万字Android主流开源框架源码解析,必须盘

    为什么读源码 很多人一定和我一样的感受:源码在工作中有用吗?用处大吗?很长一段时间内我也有这样的疑问,认为哪些有事没事扯源码的人就是在装,只是为了提高他们的逼格而已. 那为什么我还要读源码呢?一刚开始 ...

  10. 一键部署lamp脚本

    #!/bin/bash systemctl stop firewalld systemctl disable firewalld setenforce 0 #-------Apache------ # ...