亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C# Datatable篩選過濾的四種方法實(shí)現(xiàn)

 更新時(shí)間:2025年06月20日 10:43:54   作者:Nemo_XP  
本文主要介紹了C# Datatable篩選過濾的四種方法實(shí)現(xiàn),包括Select、LINQ、DataView、動(dòng)態(tài)條件,各方法在排序、性能及適用場景上有不同特點(diǎn),感興趣的可以了解一下

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

1. ‌Select方法篩選‌

這是最基礎(chǔ)的篩選方式,支持類似SQL的表達(dá)式語法

// 單條件篩選
DataRow[] rows = dt.Select("Age > 25");

// 多條件組合
DataRow[] rows = dt.Select("Name LIKE '張%' AND Age > 20");

// 帶排序的篩選
DataRow[] rows = dt.Select("Dept='銷售部'", "HireDate DESC");

特點(diǎn)‌:

  • 返回DataRow[]數(shù)組
  • 條件表達(dá)式區(qū)分大小寫
  • 性能中等,適合中小數(shù)據(jù)集

排序行為(需要注意:有主鍵會改變原始排序)‌

  • 無主鍵表‌:保持原始添加順序
  • ‌有主鍵表‌:結(jié)果將按主鍵順序排列
  • ‌顯式指定排序‌:可通過第二個(gè)參數(shù)控制排序順序

原因分析
DataTable.Select方法內(nèi)部實(shí)現(xiàn)會優(yōu)先考慮主鍵定義的順序,這是為了優(yōu)化數(shù)據(jù)檢索性能。當(dāng)表定義了主鍵時(shí),.NET框架會默認(rèn)按照主鍵順序組織數(shù)據(jù),以提高查詢效率。

// 無排序參數(shù)時(shí)行為
DataRow[] rows1 = dt.Select("Age > 25"); // 順序取決于是否有主鍵

// 顯式指定排序
DataRow[] rows2 = dt.Select("Dept='銷售部'", "HireDate DESC"); // 強(qiáng)制按指定字段排序

2. ‌LINQ查詢‌

更現(xiàn)代的篩選方式,支持強(qiáng)類型和復(fù)雜邏輯

// 我常使用
var query = dt.AsEnumerable()
              .Where(row => row["Age"]?.toString() =="25");

// 基礎(chǔ)查詢
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"]
              };

優(yōu)勢‌:

  • 編譯時(shí)類型檢查
  • 支持復(fù)雜鏈?zhǔn)讲僮?/li>
  • 可讀性更好

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

// 保持原始順序
var query1 = dt.AsEnumerable().Where(row => row.Field<int>("Age") > 25);

// 顯式排序
var query2 = from row in dt.AsEnumerable()
             orderby row.Field<DateTime>("CreateDate") descending
             select row;

3. ‌DataView過濾‌

適合需要綁定到UI控件的場景

DataView dv = new DataView(dt);
dv.RowFilter = "Status='Active'";
dv.Sort = "CreateTime DESC";

// 綁定到控件
dataGridView1.DataSource = dv;

‌特點(diǎn)‌:

  • 支持實(shí)時(shí)過濾
  • 自動(dòng)同步源數(shù)據(jù)變化
  • 性能優(yōu)于多次Select調(diào)用

排序行為

  • RowFilter 僅過濾不改變順序
  • Sort 顯式改變需單獨(dú)設(shè)置
  • 兩者組合 按Sort設(shè)置先過濾后排序

原因分析
DataView的設(shè)計(jì)將過濾(RowFilter)和排序(Sort)作為獨(dú)立屬性處理,這是為了支持UI數(shù)據(jù)綁定的靈活需求。這種分離允許開發(fā)者獨(dú)立控制過濾條件和顯示順序

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

4. ‌動(dòng)態(tài)條件構(gòu)建

適用于需要運(yùn)行時(shí)生成條件的場景

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

DataRow[] rows = dt.Select(dynamicFilter);

排序行為

  • 最終取決于使用的底層方法(Select或LINQ)
  • 條件表達(dá)式本身不影響排序

原因分析
動(dòng)態(tài)構(gòu)建的條件字符串只是改變了篩選條件,排序行為仍由執(zhí)行篩選的方法決定。這是條件表達(dá)式與排序邏輯解耦的設(shè)計(jì)。

string condition = "Age > 30";
if(includeDepartment) 
    condition += " AND Dept='IT'";

// 排序取決于Select方法的第二個(gè)參數(shù)
DataRow[] rows = dt.Select(condition, "Name ASC"); 

性能對比建議

在這里插入圖片描述

如何選擇

  • 大數(shù)據(jù)集優(yōu)先考慮DataView或添加索引
  • 復(fù)雜業(yè)務(wù)邏輯使用LINQ提升可維護(hù)性
  • 動(dòng)態(tài)條件注意SQL注入風(fēng)險(xiǎn),建議參數(shù)化
  • 頻繁查詢可緩存DataRow[]結(jié)果

特殊字符處理

當(dāng)列名或值包含特殊字符時(shí):

// 列名包含特殊字符
dt.Select("[#Rank] > 5"); 

// 值包含單引號
dt.Select($"Name='{input.Replace("'","''")}'");:ml-citation{ref="25,42" data="citationList"}

到此這篇關(guān)于C# Datatable篩選過濾各方式實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# Datatable篩選過濾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 快速學(xué)習(xí)c# 枚舉

    快速學(xué)習(xí)c# 枚舉

    這篇文章主要介紹了c# 枚舉的相關(guān)知識,文中講解非常細(xì)致,示例代碼幫助大家學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • c#自定義Attribute獲取接口實(shí)現(xiàn)示例代碼

    c#自定義Attribute獲取接口實(shí)現(xiàn)示例代碼

    這篇文章主要給大家介紹了關(guān)于c#自定義Attribute獲取接口實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • C# 執(zhí)行CMD命令并接收返回結(jié)果的操作方式

    C# 執(zhí)行CMD命令并接收返回結(jié)果的操作方式

    這篇文章主要介紹了C# 執(zhí)行CMD命令并接收返回結(jié)果的操作方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 用c#實(shí)現(xiàn)簡易的計(jì)算器功能實(shí)例代碼

    用c#實(shí)現(xiàn)簡易的計(jì)算器功能實(shí)例代碼

    這篇文章主要介紹了c#實(shí)現(xiàn)簡易的計(jì)算器功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • C#中的多線程多參數(shù)傳遞詳解

    C#中的多線程多參數(shù)傳遞詳解

    第一種解決方案的原理是:將線程執(zhí)行的方法和參數(shù)都封裝到一個(gè)類里面。通過實(shí)例化該類,方法就可以調(diào)用屬性來實(shí)現(xiàn)間接的類型安全地傳遞多個(gè)參數(shù)
    2014-01-01
  • c#連接mdf文件示例分享

    c#連接mdf文件示例分享

    這篇文章主要介紹了c#連接mdf文件示例,,需要的朋友可以參考下
    2014-03-03
  • C#程序如何調(diào)用C++?dll詳細(xì)教程

    C#程序如何調(diào)用C++?dll詳細(xì)教程

    C#和C++形成的DLL有一層天然的屏障,并不能簡單地互相調(diào)用,想要C#工程調(diào)用c++dll,需要先在其外部包裹上clr?c++的外殼,本篇文章給大家分享了C#調(diào)用C++?dll的詳細(xì)步驟和方法,有興趣的朋友可以參考學(xué)習(xí)下
    2018-07-07
  • C# .NET中Socket簡單實(shí)用框架的使用教程

    C# .NET中Socket簡單實(shí)用框架的使用教程

    最近一個(gè)項(xiàng)目因?yàn)橐玫絊ocket傳輸問題,所以決定學(xué)習(xí)一下,將自己學(xué)習(xí)的內(nèi)容總結(jié)分享出來,下面這篇文章主要給大家介紹了關(guān)于C# .NET中Socket簡單實(shí)用框架使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-09-09
  • Unity接入高德開放API實(shí)現(xiàn)IP定位

    Unity接入高德開放API實(shí)現(xiàn)IP定位

    這篇文章主要為大家介紹了Unity如何接入高德開放API實(shí)現(xiàn)IP定位功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定參考價(jià)值,需要的可以參考一下
    2022-04-04
  • C#關(guān)鍵字之覆寫overwrite介紹

    C#關(guān)鍵字之覆寫overwrite介紹

    這篇文章介紹了C#關(guān)鍵字之覆寫overwrite,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04

最新評論