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}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713958.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713958.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713958.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springboot第61集:Jenkins-Boss萬字挑戰,一文讓你走出微服務迷霧架構周刊

名詞 CONTAINER ID&#xff08;容器ID&#xff09; 名詞 IMAGE ID&#xff08;鏡像ID&#xff09;cat /etc/os-release //查看系統信息 pwd //查看當前路徑 ls //查看當前目錄文件 docker -v //查看docker版本 docker-compose up -d //在后臺運行&#xff08;取消-d是在控制臺運…

linux系統Jenkins工具添加自由項目和maven項目

Jenkins添加自由項目 添加自由項目操作流程代碼遠程代碼郵件標題郵件正文 添加maven項目準備環境操作流程 添加自由項目 gitlab配置基本代碼頁面等&#xff0c;拉取代碼&#xff0c;打包&#xff0c;發布操作流程 代碼 遠程代碼 echo ssh root192.168.188.177 "tar cz…

EasyExcel 自適應列寬、隱藏列、動態列、單元格下拉框選擇數據、單元格文本格式

前言 項目中用到EasyExcel讀寫Excel&#xff0c;用到了一下功能&#xff0c;這里做個筆記&#xff1a; 列寬自適應&#xff1a;自適應寬度隱藏列&#xff1a;隱藏某些列動態列&#xff1a;固定列 動態的生成Excel列單元格下拉框選擇數據&#xff1a;設計單元格下拉數據&…

深搜,LeetCode 2368. 受限條件下可到達節點的數目

一、題目 1、題目描述 現有一棵由 n 個節點組成的無向樹&#xff0c;節點編號從 0 到 n - 1 &#xff0c;共有 n - 1 條邊。 給你一個二維整數數組 edges &#xff0c;長度為 n - 1 &#xff0c;其中 edges[i] [ai, bi] 表示樹中節點 ai 和 bi 之間存在一條邊。另給你一個整數…

WPF的DataGrid設置標題頭

要設置DataGrid標題頭的分割線、背景色和前景色等屬性&#xff0c;您可以使用DataGrid的樣式和模板來自定義標題頭的外觀。下面是詳細解釋以及示例代碼&#xff1a; 分割線設置&#xff1a; 您可以使用DataGrid.ColumnHeaderStyle樣式中的BorderThickness和BorderBrush屬性來設…

Java基礎-java開發入門

(創作不易&#xff0c;感謝有你&#xff0c;你的支持&#xff0c;就是我前行的最大動力&#xff0c;如果看完對你有幫助&#xff0c;請留下您的足跡&#xff09; 目錄 一、什么是Java 二、Java語言的特點 三、什么是JDK 四、第一個Java程序 一、什么是Java Java是由Sun …

electron nsis 安裝包 window下任務欄無法正常固定與取消固定

問題 win10系統下&#xff0c;程序任務欄在固定后取消固定&#xff0c;展示的程序內容異常。 排查 1.通過論壇查詢&#xff0c;應該是與app的api setAppUserModelId 相關 https://github.com/electron/electron/issues/3303 2.electron-builder腳本 electron-builder…

二月打戲最燃的國漫推薦,斗羅大陸2上榜,吞噬星空堪稱第一

2024年開年&#xff0c;國漫就給我們帶來了很大的驚喜&#xff0c;在剛剛過去的2月&#xff0c;有幾部中出現了超燃的打戲&#xff0c;看得人熱血沸騰。尤其是科幻番《吞噬星空》中的一場1V1對決&#xff0c;特效和設計都堪稱第一。還有哪些國漫上榜呢&#xff1f;下面就一起來…

TCP為什么要三次握手?

TCP三次握手協議是為了在不可靠的互聯網環境中可靠地建立起一個連接&#xff0c;三次握手可以確保兩端的發送和接收能力都是正常的。 那么&#xff0c;為什么是三次而不是二次或四次握手呢&#xff1f; 為什么不是二次握手&#xff1f; 如果是二次握手&#xff0c;即客戶端發…

網絡編程 io_uring

io_uring 1、概述 io_uring是Linux&#xff08;內核版本在5.1以后&#xff09;在2019年加入到內核中的一種新型的異步I/O模型&#xff1b; io_uring使用共享內存&#xff0c;解決高IOPS場景中的用戶態和內核態的切換過程&#xff0c;減少系統調用&#xff1b;用戶可以直接向…

vue + cesium初始化地圖 + 鼠標經過地圖(點、線等其他實體)樣式

vue cesium初始化地圖 鼠標經過地圖&#xff08;點、線等其他實體&#xff09;樣式 export function initMap(mapViewer) {Cesium.Ion.defaultAccessToken "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI0OTUzOGJhMy1iNzVjLTQwZjItYWYyNy03YjA4MjM0YWE2MWMiLCJpZ…

Unity(第二十二部)官方的反向動力學一般使用商城的IK插件,這個用的不多

反向動力學&#xff08;Inverse Kinematic&#xff0c;簡稱IK&#xff09;是一種通過子節點帶動父節點運動的方法。 正向動力學 在骨骼動畫中&#xff0c;大多數動畫是通過將骨架中的關節角度旋轉到預定值來生成的&#xff0c;子關節的位置根據父關節的旋轉而改變&#xff0c;這…

編寫腳本一鍵安裝rsyslog

腳本分解 環境檢測部分 檢查操作系統 #!/bin/bash# 檢查是否為 Debian 類型 if [ -f /etc/debian_version ]; thenecho "當前操作系統是 Debian 類型"SYSLOG_SERVICE"rsyslog"INSTALL_COMMAND"apt-get install -y"CONFIG_FILE"/etc/rsys…

Vmware esxi虛擬主機狀態無效,無法注銷重啟等操作修復解決

問題 裝有ESXI系統的服務器在強制關機啟動后&#xff0c;顯示虛擬機狀態是無效的&#xff0c;并且無法進行任何操作。 解決辦法 對出問題的虛擬機重新注冊 1、開啟esxi系統的ssh功能 2、取消注冊出問題的虛擬機 找到問題的虛擬機 [rootlocalhost:~] vim-cmd vmsvc/getal…

燒腦問題解決辦法:如何選擇一款合適自己的手機流量卡

現在社會人們越來越離不開手機了&#xff0c;手機給我們生活帶來了翻天覆地的變化&#xff0c;手機需要最多的就是流量了&#xff0c;所以選擇一款合適自己的手機流量卡就顯得尤為重要了&#xff0c;今天小編就給大家來分享一下我的經驗&#xff0c;希望對大家能有幫助&#xf…

python基礎-基本數據類型深入-2.1

目錄 元組 什么是元組&#xff08;tuple&#xff09; 元組練習-1 元組的基本操作 元組常用內建函數 列表和元組的區別與總結 元組練習-2 元組練習-3 元組 什么是元組&#xff08;tuple&#xff09; 與列表&#xff08;list&#xff09;一樣&#xff0c;元組&#xff0…

【Web安全靶場】sqli-labs-master 54-65 Challenges 與62關二分法和like模糊搜索

sqli-labs-master 54-65 Challenges 其他關卡和靶場見專欄… 文章目錄 sqli-labs-master 54-65 Challenges第五十四關-聯合注入第五十五關-聯合注入第五十六關-聯合注入第五十七關-聯合注入第五十八關-報錯注入第五十九關-報錯注入第六十關-報錯注入第六十一關-報錯注入第六十…

grid的刪除

/u01/11.2.0/grid 為 grid 用戶的安裝主目錄 1、刪除 crs 配置信息 root: cd /u01/11.2.0/grid/crs/install perl rootcrs.pl -deconfig -force 2、刪除 crs 配置信息&#xff0c;并卸載軟件 cd /u01/11.2.0/grid/deinstall ./deinstall grid user: ./deinstall -home /…

Mysql與StarRocks語法上的不同

&#x1f413; 序言 StarRocks 是新一代極速全場景 MPP (Massively Parallel Processing) 數據庫。StarRocks 的愿景是能夠讓用戶的數據分析變得更加簡單和敏捷。用戶無需經過復雜的預處理&#xff0c;可以用StarRocks 來支持多種數據分析場景的極速分析。 &#x1f413; 語法…

嵌入式驅動學習第一周——linux的休眠與喚醒

前言 本文介紹進程的休眠與喚醒。 嵌入式驅動學習專欄將詳細記錄博主學習驅動的詳細過程&#xff0c;未來預計四個月將高強度更新本專欄&#xff0c;喜歡的可以關注本博主并訂閱本專欄&#xff0c;一起討論一起學習。現在關注就是老粉啦&#xff01; 行文目錄 前言1. 阻塞和非阻…