C# DataTable 对象操作
实现DataTable按字段进行分类、按列数据汇总、序列化对象数组、所有字段转小写、动态对象数组、数据分页
分类DataTableClassfiy实体:
/// <summary>/// 单个分类表/// </summary>public class DataTableClassfiy{/// <summary>/// 分类名称/// </summary>public string Name { get; set; }/// <summary>/// 分类数据/// </summary>public DataTable Data { get; set; }/// <summary>/// 该类型数量/// </summary>public int Count { get; set; }}
DataTable 操作类:
/// <summary>/// DataTable扩展类,/// </summary>public static class DataTableEx{/// <summary>/// 通过指定字段对DataTable进行分类/// </summary>/// <param name="dt">需要分类的表格</param>/// <param name="field">需要进行分类的字段</param>/// <param name="isFilterNull">是否过滤空属性</param>/// <param name="isHideData">是否赋值Data</param>/// <returns></returns>public static List<DataTableClassfiy> GetTableClassfiy(this DataTable dt, string field, bool isFilterNull = false, bool isHideData = false){List<DataTableClassfiy> tableClassfiys = new List<DataTableClassfiy>();DataView dv = new DataView(dt);DataTable dtTJ = dv.ToTable(true, field);//获取该字段唯一值for (int i = 0; i < dtTJ.Rows.Count; i++){string value = dtTJ.Rows[i][field].ToString();if (isFilterNull && string.IsNullOrWhiteSpace(value)) continue;string express = string.Format("{0}='{1}'", field, value);var res = dt.Select(express);//按条件查询出符合条件的行DataTable resDt = dt.Clone();//克隆一个表结构foreach (var j in res){resDt.ImportRow(j);//将符合条件的行放进新表}DataTableClassfiy tableClassfiy = new DataTableClassfiy(){Name = value,Data = !isHideData ? resDt : null,Count = resDt.Rows.Count};tableClassfiys.Add(tableClassfiy);}return tableClassfiys;}/// <summary>/// 通过指定列,返回数据汇总/// </summary>/// <param name="dt"></param>/// <param name="field"></param>/// <returns></returns>public static int GetSumByField(this DataTable dt, string field){var count = 0;for (int i = 0; i < dt.Rows.Count; i++){try{if (!(dt.Rows[i][field] is DBNull) && !string.IsNullOrWhiteSpace(dt.Rows[i][field].ToString())){Console.WriteLine(dt.Rows[i][field].ToString());count = count + int.Parse(dt.Rows[i][field].ToString());}}catch (Exception ex){Console.WriteLine(ex.Message);}}return count;}/// <summary>/// 返回DataTable的对象数组/// </summary>/// <typeparam name="T"></typeparam>/// <param name="dt"></param>/// <returns></returns>public static List<T> GetTableEntity<T>(this DataTable dt, bool isDesriptionAttribute = false){List<T> res = new List<T>();Type type = typeof(T);var pros = type.GetProperties();foreach (DataRow dr in dt.Rows){var ins = (T)Activator.CreateInstance(type);foreach (var pro in pros){string cName = pro.Name;if (isDesriptionAttribute is true){cName = ((DescriptionAttribute)(pro.GetCustomAttributes(typeof(DescriptionAttribute), false)[0])).Description;}if (dt.Columns.Contains(cName)){string dataType = pro.PropertyType.ToString().ToLower();if (dataType == "system.int32" || dataType == "system.double"){if (dr[cName] is DBNull){pro.SetValue(ins, 0);continue;}object value = 0;if (dataType == "system.int32"){value = int.Parse(dr[cName].ToString());}else if (dataType == "system.double"){value = double.Parse(dr[cName].ToString());}pro.SetValue(ins, value);continue;}pro.SetValue(ins, dr[cName] is DBNull ? null : dr[cName]);}}res.Add(ins);}return res;}/// <summary>/// 将Datatable所有字段转小写/// </summary>/// <param name="dt"></param>public static void GetColumnsLow(this DataTable dt){foreach (DataColumn dc in dt.Columns){dc.ColumnName = dc.ColumnName.ToLower();}}/// <summary>/// 获取DataTable的动态对象--------------DynamicObject的dynamic不能用于接口返回/// </summary>/// <param name="table"></param>/// <returns></returns>public static List<dynamic> AsObjDynamicEnumerable(this DataTable table){return table.AsEnumerable().Select(row => new DynamicRow(row)).ToList<dynamic>();}/// <summary>/// 将DataTable 转换成 List<dynamic>------------ExpandoObject的dynamic才可以用于接口返回/// reverse 反转:控制返回结果中是只存在 FilterField 指定的字段,还是排除./// [flase 返回FilterField 指定的字段]|[true 返回结果剔除 FilterField 指定的字段]/// FilterField 字段过滤,FilterField 为空 忽略 reverse 参数;返回DataTable中的全部数/// </summary>/// <param name="table">DataTable</param>/// <param name="reverse">/// 反转:控制返回结果中是只存在 FilterField 指定的字段,还是排除./// [flase 返回FilterField 指定的字段]|[true 返回结果剔除 FilterField 指定的字段]///</param>/// <param name="FilterField">字段过滤,FilterField 为空 忽略 reverse 参数;返回DataTable中的全部数据</param>/// <returns>List<dynamic></returns>public static List<dynamic> ToDbExObjnamicList(this DataTable table, bool reverse = true, params string[] FilterField){var modelList = new List<dynamic>();foreach (DataRow row in table.Rows){dynamic model = new ExpandoObject();var dict = (IDictionary<string, object>)model;foreach (DataColumn column in table.Columns){if (FilterField.Length != 0){if (reverse == true){if (!FilterField.Contains(column.ColumnName)){dict[column.ColumnName] = row[column];}}else{if (FilterField.Contains(column.ColumnName)){dict[column.ColumnName] = row[column];}}}else{dict[column.ColumnName] = row[column];}}modelList.Add(model);}return modelList;}/// <summary>/// DataRow 转换成 dynamic------------ExpandoObject的dynamic才可以用于接口返回/// reverse 反转:控制返回结果中是只存在 FilterField 指定的字段,还是排除./// [flase 返回FilterField 指定的字段]|[true 返回结果剔除 FilterField 指定的字段]/// FilterField 字段过滤,FilterField 为空 忽略 reverse 参数;返回DataTable中的全部数/// </summary>/// <param name="table">DataTable</param>/// <param name="reverse">/// 反转:控制返回结果中是只存在 FilterField 指定的字段,还是排除./// [flase 返回FilterField 指定的字段]|[true 返回结果剔除 FilterField 指定的字段]///</param>/// <param name="FilterField">字段过滤,FilterField 为空 忽略 reverse 参数;返回DataRow中的全部数据</param>/// <returns>List<dynamic></returns>public static dynamic ToDbExObjnamic(this DataRow row, bool reverse = true, params string[] FilterField){dynamic model = new ExpandoObject();var dict = (IDictionary<string, object>)model;foreach (DataColumn column in row.Table.Columns){if (FilterField.Length != 0){if (reverse == true){if (!FilterField.Contains(column.ColumnName)){dict[column.ColumnName] = row[column] is DBNull ? null : row[column];}}else{if (FilterField.Contains(column.ColumnName)){dict[column.ColumnName] = row[column] is DBNull?null: row[column];}}}else{dict[column.ColumnName] = row[column] is DBNull ? null : row[column];}}return model;}/// <summary>/// DaTable截取/// </summary>/// <param name="dt"></param>/// <param name="beginRecord"></param>/// <param name="count"></param>/// <returns></returns>public static DataTable GetTablePageBreak(this DataTable dt,int beginRecord, int count){DataTable dtTemp = dt.Clone();int endRecord = beginRecord + count;if (endRecord > dt.Rows.Count) endRecord = dt.Rows.Count;for (int i = beginRecord; i < endRecord; i++){dtTemp.ImportRow(dt.Rows[i]);}return dtTemp;}#region Private-Methodprivate sealed class DynamicRow : DynamicObject{private readonly DataRow _row;internal DynamicRow(DataRow row) { _row = row; }public override bool TryGetMember(GetMemberBinder binder, out object result){var retVal = _row.Table.Columns.Contains(binder.Name);result = retVal ? _row[binder.Name] : null;return retVal;}}#endregion}
相关文章:
C# DataTable 对象操作
实现DataTable按字段进行分类、按列数据汇总、序列化对象数组、所有字段转小写、动态对象数组、数据分页 分类DataTableClassfiy实体: /// <summary>/// 单个分类表/// </summary>public class DataTableClassfiy{/// <summary>/// 分类名称/// &…...
web运行时安全
1.输入验证 对传递的数据的格式、长度、类型(前端和后端都要)进行校验。 对黑白名单校验:比如前端传递了一个用户名,可以搜索该用户是否在白名单或者黑名单列表。 针对黑名单校验,比如: // 手机号验证…...

FPGA 与 数字电路的关系 - 这篇文章 将 持续 更新 :)
先说几个逻辑:(强调一下在这篇文章 输入路数 只有 1个或2个,输出只有1个,N个输入M个输出以后再说) 看下面的几个图: 图一( 忘了 这是 啥门,不是门吧 :)也就…...

18 SpringMVC实战
18 SpringMVC实战 1. 课程介绍2. Spring Task定时任务1. 课程介绍 2. Spring Task定时任务 package com.imooc.reader.task...

Rocky Linux 运维工具 dnf
一、dnf的简介 dnf是用于在基于RPM包管理系统的包管理工具。用户可以通过 yum来搜索、安装、更新和删除软件包,自动处理依赖关系,它是yum的继任者,旨在提供更快速、更现代化的软件包管理体验。。 二、dnf 的参数说明 序号参数描述1in…...

浅谈 Linux fork 函数
文章目录 前言fork 基本概念代码演示示例1:体会 fork 函数返回值的作用示例2:创建多进程,加深对 fork 函数的理解 前言 本篇介绍 fork 函数。 fork 基本概念 pid_t fork(void) fork 的英文含义是"分叉",在这里就是 …...
golang 装饰器模式详解
前言 我一直以来对golang的装饰器模式情有独衷,不是因为它酷,而是它带给我了太多的好处。首先我不想说太多的概念,熟记这些概念对我的编程来说一点用处没有。我只知道它给我带来了好处,下面谈谈我的理解。 这种模式可以很轻松地…...
刷题笔记day27-回溯算法2
216. 组合总和 III 这个思路还是,三部曲: 终止条件处理单层节点回溯节点 题中说的是,1到9的数,不能有重复。 k个数,和为n。 那么只要 len(path) k 的时候,判断 n 为0,就可以入切片了。 fun…...

前端架构: 脚手架命令行交互核心实现之inquirer和readline的应用教程
命令行交互核心实现 核心目标:实现命令行行交互,如List命令行的交互呢比命令行的渲难度要更大,因为它涉及的技术点会会更多它涉及以下技术点 键盘输入的一个监听 (这里通过 readline来实现)计算命令行窗口的尺寸清屏光标的移动输出流的静默 …...

【C++初阶】内存管理
目录 一.C语言中的动态内存管理方式 二.C中的内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 3.浅识抛异常 (内存申请失败) 4.new和delete操作自定义类型 三.new和delete的实现原理 1.内置类型 2.自定义类型 一.C语…...

《PyTorch深度学习实践》第十二讲循环神经网络基础
一、RNN简介 1、RNN网络最大的特点就是可以处理序列特征,就是我们的一组动态特征。比如,我们可以通过将前三天每天的特征(是否下雨,是否有太阳等)输入到网络,从而来预测第四天的天气。 我们可以看RN…...

蓝桥杯算法题汇总
一.线性表:链式 例题:旋转链表 二.栈: 例题:行星碰撞问题 三.队列 三.数组和矩阵 例题: 四.哈希表 五.二叉树 主要方法是递归 主要考察点是遍历:前序,中序,后序遍历,层…...

【MySQL】学习多表查询和笛卡尔积 - 副本
](https://img-blog.csdnimg.cn/21dd41dce63a4f2da07b9d879ad0120b.png#pic_center) ??个人主页: ??热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ??个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-N8PeTKG6uLu4bJuM {font-family:“trebuchet ms”,…...

C++设计模式_创建型模式_工厂方法模式
目录 C设计模式_创建型模式_工厂方法模式 一、简单工厂模式 1.1 简单工厂模式引入 1.2 简单工厂模式 1.3 简单工厂模式利弊分析 1.4 简单工厂模式的UML图 二、工厂方法模式 2.1 工厂模式和简单工厂模式比较 2.2 工厂模式代码实现 2.3 工厂模式UML 三、抽象工厂模式 3.1 战斗场景…...

matlab批量替换txt文本文件的特定行的内容
1.下图所示,我想要替换第14行。 2.运行代码后,第14行已经更改为需要的内容。 clc,clear; %%----------------------需要更改的地方------------------------------------ % 设置要操作的文本文件路径,替换为你自己的文件路径 path D:\paper_…...

Qt Creator配置MSVC编译环境、调试环境
在windows上开发,一般使用Qt Creator自带mingw编译器,编译和调试都很方便,安装Qt时勾选后,自动配置完毕。 但是有时候我们需要使用MSVC的编译器,这个时候我们没法直接使用,需要配置环境才能使用࿰…...
Linux系统运维命令:终止监听在 TCP端口80上的所有进程(使用lsof,grep,awk组合命令, 终止监听在 TCP某个端口上的所有进程)
目 录 一、需求 二、解决方法 1、解决思路 2、命令 三、实例演示和命令解释 1、实例演示 (1)查看目前有哪些在TCP端口80监听的进程 (2)、使用命令 (3)、查看效果 2、命令解…...
开源模型应用落地-业务优化篇(七)
一、背景 在本篇学习中,我们要介绍消息中间件,它可以帮助我们将核心和辅助流程分开,让它们互相独立。同时,还要关注在使用消息中间件时需要注意的地方。并且将这种思想应用到其他实际场景中。 二、术语 2.1、消息中间件 消息中间件是一种在分布式系统中用于处理消息传递的…...
序列化-反序列化--json-xml-protoBuf
序列化和反序列化 数据在网络中传输需要按照一定的规范组成。这些规定的规范有json,xml,protobuf。 序列化 也就是说数据需要通过网络传输时,需要把数据转化为需要的传输格式,所以需要把需要传输的数据生成json或者xml或者protobuf语言格式文件&#…...
ubuntu 配置nacos开机启动
在Ubuntu系统上配置Nacos服务开机启动,可以通过创建systemd服务单元文件来实现。以下是步骤: 创建Systemd服务文件: 打开终端,使用文本编辑器(如nano或vim)新建一个服务文件: sudo nano /etc/sy…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...