最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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ù)集

排序行為(需要注意:有主鍵會(huì)改變?cè)寂判颍?zwnj;

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

原因分析
DataTable.Select方法內(nèi)部實(shí)現(xiàn)會(huì)優(yōu)先考慮主鍵定義的順序,這是為了優(yōu)化數(shù)據(jù)檢索性能。當(dāng)表定義了主鍵時(shí),.NET框架會(huì)默認(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ì)原則之一是"不改變?cè)磾?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"); 

性能對(duì)比建議

在這里插入圖片描述

如何選擇

  • 大數(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"); 

// 值包含單引號(hào)
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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#實(shí)現(xiàn)IDbConnection/IDbCommand等相關(guān)通用數(shù)據(jù)接口

    C#實(shí)現(xiàn)IDbConnection/IDbCommand等相關(guān)通用數(shù)據(jù)接口

    ADO.NET?中的數(shù)據(jù)提供者對(duì)象提供了IDbConnection、IDbCommand、IDbDataParameter等通用數(shù)據(jù)接口,本文將利用這些對(duì)象實(shí)現(xiàn)一個(gè)通用方法以訪問和操作數(shù)據(jù)庫內(nèi)容,需要的朋友可以參考下
    2024-04-04
  • C# CancellationToken和CancellationTokenSource的用法詳解

    C# CancellationToken和CancellationTokenSource的用法詳解

    做了.net core之后,發(fā)現(xiàn)CancellationToken用的越來越平凡了。這也難怪,原來.net framework使用異步的不是很多,而.net core首推異步編程,到處可以看到Task的影子,而CancellationToken正好是異步Task的一個(gè)控制器,所以花點(diǎn)時(shí)間做個(gè)筆記
    2021-06-06
  • C#姓名脫敏的幾種實(shí)現(xiàn)方法

    C#姓名脫敏的幾種實(shí)現(xiàn)方法

    在C#中實(shí)現(xiàn)姓名脫敏,主要通過字符串處理來隱藏部分信息,保護(hù)用戶隱私,下面就來詳細(xì)的介紹一下幾種實(shí)現(xiàn)方法,感興趣的可以了解一下
    2025-11-11
  • C#生成DLL文件的方法

    C#生成DLL文件的方法

    這篇文章主要介紹了C#生成DLL文件的方法,較為詳細(xì)的分析了使用C#生成DLL文件所涉及的相關(guān)技巧與實(shí)現(xiàn)方法,需要的朋友可以參考下
    2015-07-07
  • C#權(quán)限管理和設(shè)計(jì)淺談

    C#權(quán)限管理和設(shè)計(jì)淺談

    權(quán)限管理是很多軟件中相當(dāng)重要的一個(gè)模塊——它的設(shè)計(jì)的好壞直接影響到軟件的安全性、權(quán)限管理的可擴(kuò)展性和易操作性 以及代碼中權(quán)限判斷的復(fù)雜程度和效率等方面
    2012-02-02
  • C#中的引用類型以及特殊引用類型詳解

    C#中的引用類型以及特殊引用類型詳解

    本文詳細(xì)講解了C#中的引用類型以及特殊引用類型,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C# 無邊框窗體邊框陰影效果的簡單實(shí)現(xiàn)

    C# 無邊框窗體邊框陰影效果的簡單實(shí)現(xiàn)

    這篇文章介紹了C# 無邊框窗體邊框陰影效果的簡單實(shí)現(xiàn),有需要的朋友可以參考一下
    2013-10-10
  • Unity實(shí)現(xiàn)UI漸隱漸顯效果

    Unity實(shí)現(xiàn)UI漸隱漸顯效果

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)UI漸隱漸顯效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 淺談Visual Studio 2019 Vue項(xiàng)目的目錄結(jié)構(gòu)

    淺談Visual Studio 2019 Vue項(xiàng)目的目錄結(jié)構(gòu)

    這篇文章主要介紹了Visual Studio 2019 Vue項(xiàng)目 目錄結(jié)構(gòu),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 詳解c# 并行計(jì)算

    詳解c# 并行計(jì)算

    本文主要介紹了并行計(jì)算的簡單使用,并行循環(huán)的中斷和跳出、并行循環(huán)中為數(shù)組/集合添加項(xiàng)、返回集合運(yùn)算結(jié)果/含有局部變量的并行循環(huán)、、PLinq(Linq的并行計(jì)算)等相關(guān)內(nèi)容。
    2020-12-12

最新評(píng)論

大渡口区| 衢州市| 内江市| 荔浦县| 竹山县| 微山县| 抚州市| 阿尔山市| 深州市| 乌兰察布市| 竹溪县| 阳东县| 乌海市| 汨罗市| 左云县| 文成县| 长丰县| 开化县| 永顺县| 大厂| 达拉特旗| 岐山县| 无为县| 饶阳县| 达州市| 开江县| 读书| 承德县| 江川县| 丹寨县| 巴彦县| 盖州市| 山西省| 和政县| 周至县| 泾源县| 大理市| 绥阳县| 安吉县| 庄浪县| 广州市|