一,前言

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. ecshop二次开发笔记--订单表结构ecs_order_info说明

    -- 表的结构 `ecs_order_info`  CREATE TABLE IF NOT EXISTS `ecs_order_info` (  `order_id` mediumint(8) uns ...

  2. IO流之节点流(字符流)和数据流关闭

    ​输入流----Reader 1 public class Reader { 2 public static void main(String[] args) throws Exception { 3 ...

  3. 第三篇 -- Go语言其他类型转String方法

    1. int转string // 法1: int转string num_int := 10 num_str_2 := fmt.Sprintf("%b", num_int) fmt. ...

  4. redis数据类型及应用场景

    0.key的通用操作 KEYS * keys a keys a* 查看已存在所有键的名字 ****TYPE 返回键所存储值的类型 ****EXPIRE\ PEXPIRE 以秒\毫秒设定生存时间 *** ...

  5. 15Java进阶 进程

    1 线程控制 t.join():让主线程进入线程池,等待t执行完才执行. t.sleep():让线程阻塞,休眠一段时间,休眠结束后进入就绪状态.不会释放锁. t.yield():让线程让出CPU,从运 ...

  6. SourceTree 3.1.3版本跳过注册

    1.进入文件夹 %LocalAppData%\Atlassian\SourceTree\ 找到SourceTree的目录 2.里面添加一个json文件 accounts.json 内容如下: [{&q ...

  7. 通过比较rgb破解滑动验证码

    目标url:信用中国(广东中山)行政处罚 /** * base64转BufferedImage * * @param base64 * @return */ public static Buffere ...

  8. 操作系统思考 第十一章 C语言中的信号量

    第十一章 C语言中的信号量 作者:Allen B. Downey 原文:Chapter 11 Semaphores in C 译者:飞龙 协议:CC BY-NC-SA 4.0 信号量是学习同步的一个好 ...

  9. Reuse Sonar Checkstyle Violation Report for Custom Data Analysis

    Write a violation rules file; Import it into Sonar as a Quality Profile named as "MyRules" ...

  10. JSON.stringify()的用法

    **JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串,而我们一般只是用了第一个参数,没有在意过第二个以及第三个参数的妙用** **1.最常用的方式:** ...