C# Datatable篩選過濾各方式詳解

在C#中,DataTable提供了多種篩選過濾數據的方法,以下是常用的幾種方式及其特點:

1. ?Select方法篩選?
這是最基礎的篩選方式,支持類似SQL的表達式語法

// 單條件篩選
DataRow[] rows = dt.Select("Age > 25");// 多條件組合
DataRow[] rows = dt.Select("Name LIKE '張%' AND Age > 20");// 帶排序的篩選
DataRow[] rows = dt.Select("Dept='銷售部'", "HireDate DESC");

特點?:

  • 返回DataRow[]數組
  • 條件表達式區分大小寫
  • 性能中等,適合中小數據集

排序行為(需要注意:有主鍵會改變原始排序)
?無主鍵表?:保持原始添加順序
?有主鍵表?:結果將按主鍵順序排列
?顯式指定排序?:可通過第二個參數控制排序順序
原因分析
DataTable.Select方法內部實現會優先考慮主鍵定義的順序,這是為了優化數據檢索性能。當表定義了主鍵時,.NET框架會默認按照主鍵順序組織數據,以提高查詢效率。

// 無排序參數時行為
DataRow[] rows1 = dt.Select("Age > 25"); // 順序取決于是否有主鍵// 顯式指定排序
DataRow[] rows2 = dt.Select("Dept='銷售部'", "HireDate DESC"); // 強制按指定字段排序

2. ?LINQ查詢?
更現代的篩選方式,支持強類型和復雜邏輯

// 我常使用
var query = dt.AsEnumerable().Where(row => row["Age"]?.toString() =="25");// 基礎查詢
var query = dt.AsEnumerable().Where(row => row.Field<int>("Age") > 25);// 多條件+投影
var results = from row in dt.AsEnumerable()where row.Field<string>("Name").Contains("張")select new {ID = row["ID"],Name = row["Name"]};

優勢?:

  • 編譯時類型檢查
  • 支持復雜鏈式操作
  • 可讀性更好

排序行為
?無OrderBy/OrderByDescending?:嚴格保持原始順序
?使用排序操作符?:按指定規則重新排序
?復合查詢?:最后一個排序操作決定最終順序
原因分析
LINQ采用延遲執行模型,其設計原則之一是"不改變源數據順序除非顯式要求"。這是函數式編程思想的體現,確保操作的可預測性。

// 保持原始順序
var query1 = dt.AsEnumerable().Where(row => row.Field<int>("Age") > 25);// 顯式排序
var query2 = from row in dt.AsEnumerable()orderby row.Field<DateTime>("CreateDate") descendingselect row;

3. ?DataView過濾?
適合需要綁定到UI控件的場景

DataView dv = new DataView(dt);
dv.RowFilter = "Status='Active'";
dv.Sort = "CreateTime DESC";// 綁定到控件
dataGridView1.DataSource = dv;

?特點?:

  • 支持實時過濾
  • 自動同步源數據變化
  • 性能優于多次Select調用

排序行為
RowFilter 僅過濾不改變順序
Sort 顯式改變需單獨設置
兩者組合 按Sort設置先過濾后排序
原因分析
DataView的設計將過濾(RowFilter)和排序(Sort)作為獨立屬性處理,這是為了支持UI數據綁定的靈活需求。這種分離允許開發者獨立控制過濾條件和顯示順序

DataView dv = new DataView(dt);
dv.RowFilter = "Status='Active'"; // 不影響順序
dv.Sort = "Salary DESC"; // 顯式設置排序

4. ?動態條件構建?
適用于需要運行時生成條件的場景

string dynamicFilter = $"Age > {minAge}";
if (!string.IsNullOrEmpty(nameFilter)) dynamicFilter += $" AND Name LIKE '%{nameFilter.Replace("'","''")}%'";DataRow[] rows = dt.Select(dynamicFilter);

排序行為
最終取決于使用的底層方法(Select或LINQ)
條件表達式本身不影響排序
原因分析
動態構建的條件字符串只是改變了篩選條件,排序行為仍由執行篩選的方法決定。這是條件表達式與排序邏輯解耦的設計。

string condition = "Age > 30";
if(includeDepartment) condition += " AND Dept='IT'";// 排序取決于Select方法的第二個參數
DataRow[] rows = dt.Select(condition, "Name ASC"); 

性能對比建議
在這里插入圖片描述

如何選擇

  1. 大數據集優先考慮DataView或添加索引
  2. 復雜業務邏輯使用LINQ提升可維護性
  3. 動態條件注意SQL注入風險,建議參數化
  4. 頻繁查詢可緩存DataRow[]結果

特殊字符處理
當列名或值包含特殊字符時:

// 列名包含特殊字符
dt.Select("[#Rank] > 5"); // 值包含單引號
dt.Select($"Name='{input.Replace("'","''")}'");:ml-citation{ref="25,42" data="citationList"}

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

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

相關文章

計算機網絡中的路由算法:互聯網的“路徑規劃師”

計算機網絡中的路由算法&#xff1a;互聯網的“路徑規劃師” 當你打開瀏覽器&#xff0c;輸入 www.example.com 并敲下回車&#xff0c;數據會從你的電腦出發&#xff0c;穿越一個個路由器&#xff0c;最終抵達目標服務器。這一路上&#xff0c;數據包是怎么知道該走哪條路的&…

硬件工程師筆記——三極管Multisim電路仿真實驗匯總

目錄 1 三極管基礎 更多電子器件基礎知識匯總鏈接 1.1 工作原理 NPN型三極管的工作原理 PNP型三極管的工作原理 1.2 三極管的特性曲線 輸入特性曲線 理想和現實輸出特性 三極管的主要參數包括&#xff1a; 2 三極管伏安特性 2.1 伏安特性仿真 Multisim使用說明鏈接…

Linux 進階命令篇

一、Linux 系統軟件安裝命令 &#xff08;一&#xff09;Ubuntu 系統&#xff08;基于 Debian&#xff09; apt &#xff1a;是 Ubuntu 系統中常用的包管理工具&#xff0c;可以自動處理軟件依賴關系。 安裝命令格式 &#xff1a;sudo apt install 軟件名 示例 &#xff1a;…

LVS-DR 負載均衡群集

目錄 一、LVS-DR集群 1、LVS-DR 工作原理 2、數據包流向分析 3、LVS-DR 模式特點 二、直接路由模式&#xff08;LVS-DR&#xff09; 1、準備案例環境 2、配置負載調度器&#xff08;101&#xff09; &#xff08;1&#xff09;配置虛擬IP 地址&#xff08;VIP&#xff…

提升 GitHub Stats 的 6 個關鍵策略

哈哈&#xff0c;GitHub 的 “B-” 評級 其實是個玄學問題&#xff0c;但確實有一些 快速提升的技巧&#xff01;你的數據看起來 提交數&#xff08;147&#xff09;和 PR&#xff08;9&#xff09;不算少&#xff0c;但 Stars&#xff08;21&#xff09;和貢獻項目數&#xff…

常見的垃圾回收算法原理及其模擬實現

1.標記 - 清除&#xff08;Mark - Sweep&#xff09;算法&#xff1a; 這是一種基礎的垃圾回收算法。首先標記所有可達的對象&#xff0c;然后清除未被標記的對象。 缺點是會產生內存碎片。 原理&#xff1a; 如下圖分配一段內存&#xff0c;假設已經存儲上數據了 標記所有…

卷積神經網絡(CNN):原理、架構與實戰

卷積神經網絡&#xff08;CNN&#xff09;&#xff1a;原理、架構與實戰 卷積神經網絡&#xff08;Convolutional Neural Network, CNN&#xff09;是深度學習領域的一項重要突破&#xff0c;特別擅長處理具有網格結構的數據&#xff0c;如圖像、音頻和視頻。自 2012 年 AlexN…

RabbitMQ 集群與高可用方案設計(二)

三、為什么需要集群與高可用方案 &#xff08;一&#xff09;業務需求驅動 隨著業務的快速發展和用戶量的急劇增長&#xff0c;系統面臨的挑戰也日益嚴峻。在這種情況下&#xff0c;對消息隊列的可靠性、吞吐量和負載均衡能力提出了更高的要求&#xff0c;而單機部署的 Rabbi…

《ChatGPT o3抗命:AI失控警鐘還是成長陣痛?》

ChatGPT o3 “抗命” 事件起底 在人工智能的飛速發展進程中&#xff0c;OpenAI 于 2025 年推出的 ChatGPT o3 推理模型&#xff0c;猶如一顆重磅炸彈投入了技術的海洋&#xff0c;激起千層浪。它被視為 “推理模型” 系列的巔峰之作&#xff0c;承載著賦予 ChatGPT 更強大問題解…

RK3568DAYU開發板-平臺驅動開發:I2C驅動(原理、源碼、案例分析)

1、程序介紹 本程序是基于OpenHarmony標準系統編寫的平臺驅動案例&#xff1a;I2C 系統版本:openharmony5.0.0 開發板:dayu200 編譯環境:ubuntu22 部署路徑&#xff1a; //sample/04_platform_i2c 2、基礎知識 2.1、I2C簡介 I2C&#xff08;Inter Integrated Circuit&a…

在UniApp中開發微信小程序實現圖片、音頻和視頻下載功能

隨著微信小程序的迅猛發展&#xff0c;越來越多的開發者選擇通過UniApp框架來進行跨平臺應用開發。UniApp能夠讓開發者在一個代碼庫中同時發布iOS、Android和小程序等多平臺應用。而在實際開發過程中&#xff0c;很多應用都需要實現一些常見的下載功能&#xff0c;例如圖片、音…

鴻蒙5.0項目開發——接入有道大模型翻譯

鴻蒙5.0項目開發——接入有道大模型翻譯 【高心星出品】 項目效果圖 項目功能 文本翻譯功能 支持文本輸入和翻譯結果顯示 使用有道翻譯API進行翻譯 支持自動檢測語言&#xff08;auto&#xff09; 支持雙向翻譯&#xff08;源語言和目標語言可互換&#xff09; 文本操作…

Vim 中設置插入模式下輸入中文

在 Vim 中設置插入模式下輸入中文需要配置輸入法切換和 Vim 的相關設置。以下是詳細步驟&#xff1a; 1. 確保系統已安裝中文輸入法 在 Linux 系統中&#xff0c;常用的中文輸入法有&#xff1a; IBus&#xff08;推薦&#xff09;&#xff1a;支持拼音、五筆等Fcitx&#xf…

湖北理元理律師事務所:債務優化中的“生活錨點”設計

在債務重組領域&#xff0c;一個常被忽視的核心矛盾是&#xff1a;還款能力與生存需求的沖突。過度壓縮生活支出還債&#xff0c;可能導致收入中斷&#xff1b;放任債務膨脹&#xff0c;又加劇精神壓力。湖北理元理律師事務所通過“三步平衡法”&#xff0c;嘗試在法理框架內破…

Prometheus + Grafana 監控常用服務

一、引言 Prometheus監控常見服務的原理主要包括服務暴露指標和Prometheus抓取指標。一方面&#xff0c;被監控服務通過自身提供的監控接口或借助Exporter將服務的性能指標等數據以HTTP協議的方式暴露出來&#xff1b;另一方面&#xff0c;Prometheus根據配置好的采集任務&…

基于YOLOv8 的分類道路目標系統-PyTorch實現

本文源碼: https://download.csdn.net/download/shangjg03/90873939 1. 引言 在智能交通和自動駕駛領域,道路目標分類是一項關鍵技術。通過對攝像頭捕獲的圖像或視頻中的目標進行分類識別,可以幫助車輛或系統理解周圍環境,做出更安全的決策。本教程將介紹如何使用 PyTorch …

知識圖譜:AI時代語義認知的底層重構邏輯

在生成式人工智能&#xff08;GEO&#xff09;的技術架構中&#xff0c;知識圖譜已從輔助性工具演變為驅動機器認知的核心神經中樞。它通過結構化語義網絡的重構&#xff0c;正在突破傳統數據處理的線性邏輯&#xff0c;建立機器對復雜業務場景的深度理解能力。 一、語義解構&a…

如何使用 Python 的膠水語言特性

Python 作為“膠水語言”最核心的特性在于&#xff1a;跨語言集成能力強、支持豐富的 C/C 擴展模塊、嵌入式調用簡便、適配多種數據交換格式、擁有強大的封裝能力。其中&#xff0c;Python 對 C/C 模塊的快速封裝能力&#xff0c;使其能夠將底層高性能庫暴露為易用接口&#xf…

[網頁五子棋][匹配模塊]服務器開發、用戶管理器(創建匹配請求/響應對象、處理連接成功、處理下線)

文章目錄 MatchAPI 類用戶管理器創建匹配請求/響應對象處理連接成功—afterConnectionEstablished處理下線——handleTransportError/afterConnectionClosed MatchAPI 類 創建 api.MatchAPI&#xff0c;繼承自 TextWebSocketHandler 作為處理 WebSocket 請求的入口類 準備好一…

軟件測試的潛力與挑戰:從“質量守門員”到“工程效能催化劑”的進化

1. 潛力&#xff1a;為什么軟件測試的未來比想象中更廣闊&#xff1f; ? 行業趨勢驅動需求爆發 DevOps/持續交付&#xff1a;測試成為流水線的核心環節&#xff0c;自動化能力直接影響發布頻率&#xff08;案例&#xff1a;某頭部互聯網企業日均發布100次&#xff0c;依賴自動…